子集和问题【回溯法】
子集和问题的一个实例为<S,c>。其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。
试设计一个解子集和问题的回溯法。
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=1005; int n,c; int s[maxn]; int cnt=0,sum=0; int vis[maxn]; int flag=0; void solve(int x){ if(flag) return ;//找到一组解就返回 if(sum==c){ flag=1; for(int i=0;i<n;i++){ if(vis[i]) printf("%d ",s[i]);//打印输出可行解 } printf("\n"); return; }else{ sum+=s[x]; vis[x]=1; solve(x+1); vis[x]=0;//回溯时要还原 sum-=s[x]; solve(x+1); } } int main() { scanf("%d%d",&n,&c); for(int i=0;i<n;i++){ scanf("%d",&s[i]); } solve(0); if(!flag) printf("No Solution\n"); return 0; } /* 5 10 2 2 6 5 4 */