1.24模拟赛补充
这道题就是一道搜索求和的问题,用到了回溯,找到后直接输出结束即可,反之无解,注意有一个优化就是输入的时候累加求和,如果总和都不够,那就必然不够
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,c,s[10000],flag,ans[10000],vis[10000]; void print(int x){ for(int i=1;i<=x;++i){ printf("%d ",ans[i]); } flag = 1; } int jia; void dfs(int sum,int cur){ //printf("%d ",++jia); if(cur > n)return; if(sum == c){ print(cur-1); exit(0); } if(sum > c)return; for(int i=1;i<=n;++i){ if(!vis[i] && sum + s[i] <= c){ vis[i] = 1; ans[cur] = s[i]; dfs(sum+s[i],cur+1); vis[i] = 0; } } } int main(){ scanf("%d%d",&n,&c); for(int i=1;i<=n;++i){ scanf("%d",s+i); jia += s[i]; } if(jia < c){ puts("No Solution!"); return 0; } dfs(0,1); puts("No Solution!"); }
在二维数组里面搜索,与八皇后类似,回溯做法
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,a[30][30],mini = 1e9,vis[25]; void dfs(int sum,int cur){ if(sum > mini)return; if(cur == n + 1){ mini = min(mini,sum); return ; } for(int i=1;i<=n;++i){ if(!vis[i]){ vis[i] = 1; dfs(sum+a[cur][i],cur+1); vis[i] = 0; } } } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j)scanf("%d",&a[i][j]); } dfs(0,1); printf("%d",mini); } /* 3 4 2 5 2 3 6 3 4 5 */
这题直接dfs他,用回溯会慢(有可能挂掉,不过我没试),其实01背包也可,不过重在练习搜索
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,c,w[1005],ma = -1e9; void dfs(int sum,int cur){ //printf("sum=%d cur=%d\n",sum,cur); if(sum > c)return ;ma = max(ma,sum); if(cur == n + 1){ return ; } dfs(sum,cur+1); dfs(sum+w[cur],cur+1); } int main(){ scanf("%d%d",&n,&c); for(int i=1;i<=n;++i)scanf("%d",&w[i]); dfs(0,1); printf("%d",ma); }