子集和问题 算法分析
#include<iostream>
using namespace std;
int n=0,c=0;
int d[10000];
int t[10000];
int l=0;
int flag=0;
int sum=0;
void backtrack(int ,int,int);
int main()
{
cout<<"请输入n和c";
cin>>n>>c;
for(int i=0;i<n;i++)
cin>>d[i];
for(int i=1;i<=n;i++)
{
backtrack(i,0,n-1);
if(flag == 1)
break;
}
if (flag == 0){
cout<<"No Solution!"<<endl;
}
else{
for (int i = 0; i < l-1; ++i) {
cout<<t[i]<<' ';
}
cout<<t[l-1]<<endl;
}
}
void backtrack(int x,int s1,int s2)
{
if (x == 0)
{
if(sum == c)
flag = 1;
//cout<<sum<<endl;
return;
}
for (int i = s1; i <= s2; ++i) {
sum += d[i];
t[l++] = d[i];//保存所加的数
if (sum<=c) //剪掉不可能的分支
backtrack(x-1,i+1,s2);
if (flag == 1) //找到结果,退出
return;
l--;//如果不满足,l--
sum -= d[i];//不满足减去
}
}