对于给定的正整数集合S={w_1,w_2,……,w_n}和正整数C, 编写程序计算S的一个子集S1,使得S1的和为C。
输入要求:输入的第1行为两个整数C和N,分别表示子集S1的和和元素的个数。第2行有N个整数,表示该集合中的每一个元素,1≤N≤10000。
输出要求:当问题有解时输出构成该子集的每个元素;当问题无解是输出“No Solution!”。
样例输入:
5 3
2 2 6 5 4
样例输出:
No Solution!
如果只需要求出一个满足和为C的子集
#include<stdio.h>
#define M 10000
int n[M];
int out[M]={0};
int N,C;
int flag=0;
int sum=0;
void solve(int i)
{
if(sum==C)
{
flag=1;
return ;
}
if(flag==1||i>=N)
return ;
sum+=n[i];
if(sum<=C)//直接遍历左子树
{
out[i]=1;
solve(i+1);
}
else{//直接遍历右子树
sum-=n[i];
solve(i+1);
return;
}
if(flag==0)
/*从左子树返回后遍历右子树,而flag=0表示没有找到合适子集,
而若是找到了满足要求的子集就结束对剩余树的遍历直接返回以便节省时间。
因此若是需要求得所有和为C的子集就去掉这里的flag条件使得程序可以遍历整棵树*/
{
sum-=n[i];
out[i]=0;
solve(i+1);
}
return;
}
int main()
{