2018/7/28
P1036 选书
ps:dfs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//递归写全排列,直接判断素数 //递归是形式,用递归实现dfs ,暴搜 //递归边界条件用来剪枝 #include<iostream> using namespace std; #include<cmath> bool is_prime(int x){ for(int i=2;i<=sqrt(x);i++){ if(x%i==0) return false; } return true ; } int n,k; int ans; int a[21]; void dfs(int step,int sum,int cnt){ if(step == n+1 || cnt == k ){ if(is_prime(sum)) { if(cnt == k) ans++; } return ; } dfs(step+1,sum+a[step],cnt+1); dfs(step+1,sum,cnt); return ; } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } ans=0; dfs(1,0,0); cout<<ans<<endl; }
P1028 数的计算
ps:递推
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//递归写错了 //#include<bit/stdc++.h> // /*#include<iostream> using namespace std; int m[110]; int digui(int x){ if(m[x] != 0){ return m[x]; } if(x==1 ){ return 0; } else if(x ==2) { return 3; } else if(x == 3){ return 5; } return m[x]=digui(x/2)+1; } int n; int main(){ //memset(m,0,sizeof(m)); cin>>n; for(int i=0;i<=n;i++){ m[i]=0; } cout<<digui(n)<<endl; //system("pause"); return 0; } */ //不能只存后缀吗?错了 /*#include<iostream> using namespace std; int n; int f[1100]; int main(){ cin>>n; f[1]=1; f[2]=3; f[3]=5; f[4]=4; for(int i=5;i<=n;i++){ f[i]=f[i/2]+1; } cout<<f[n]<<endl; system("pause"); return 0; }*/ //re是数组开的太小了,数组越界 #include<iostream> using namespace std; int n; int f[1100]; int main(){ cin>>n; f[1]=1; f[2]=2; f[3]=2; f[4]=4; for(int i=5;i<=n;i++){ for(int j=1;j<=i/2;j++){ f[i]+=f[j]; } f[i]+=1; } cout<<f[n]<<endl; //system("pause"); return 0; }