回溯法之子集和问题

/* 时间: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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值