子集和问题的一个实例为<S,c>。其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。
子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。
子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。
问题分析:将问题的所有解空间进行构造,得到一棵二叉树。回溯法求解。
#include <stdio.h>
int i,n,c;//S中元素个数n 及 c的值
int sum=0,flag=0;
int *S,*mark;
void backtrack(int t)
{
if(t==n)
{
if(sum==c)
{
flag=1;
for(i=0;i<n;i++)
if(mark[i])
printf("%d ",S[i]);
}
}
else
{
//含S[t]回溯
sum+=S[t];
mark[t]=1;
backtrack(t+1);
mark[t]=0;
sum-=S[t];
//不含S[t]回溯
backtrack(t+1);
}
}
int main()
{
scanf("%d%d",&n,&c);
S=new int[n];
mark=new int[n];
for(i=0;i<n;i++)//输入各元素的值
{
scanf("%d",&S[i]);
mark[i]=0;
}
backtrack(0);
if(flag==1)
printf("\nHaving a solution!\n");
else
printf("\nNot having a solution!\n");
return 0;
}