/* 时间:2011-11-21 作者:xiaosi 题目:子集和问题 */ #include<iostream> #include<cstdio> using namespace std; #define M 100 class SumOfSub { friend void sumofsub(); private: void Backtrack(int t); int count; int n; int c; int cw; int x[M]; int bestx[M]; int num[M]; }; void SumOfSub::Backtrack(int t) {//搜索t第层 int i,j; if(t>n)//到达叶子节点 { if(cw == c&&count ==0) { count++; for(i=1;i<=n;i++) { if(x[i]==1) { printf("%d ",num[i]); } } printf("\n"); } return; } else { if(cw+num[t]<= c) { cw+=num[t]; x[t]=1; Backtrack(t+1); cw-=num[t]; } x[t]=0; Backtrack(t+1); } } void sumofsub() { int i,j; SumOfSub s; s.cw = 0; s.count =0; scanf("%d %d",&s.n,&s.c); for(j=1;j<=s.n;j++) { scanf("%d",&s.num[j]); } for(j=1;j<=s.n;j++) { s.x[j]=0; } s.Backtrack(1); if(s.count == 0) { printf("No Solution!"); } } int main() { sumofsub(); return 0; }
回溯法之子集和问题
最新推荐文章于 2023-12-07 16:35:39 发布