回溯法求解子集和数问题
给定一个n个整数的集合X={x1,x2....xn}和整数y,找出和等于y的X的子集Y.比如:若X={10,20,30,40,50,60}和y=60,则有三种不同长度的解,它们分别是{10,20,30},{20,40},{60}.这个问题可以用另一种方法明确表达,使得解是一种明显的长度为n的布尔向量,于是上面的三个解可以用布尔向量表示为:{1,1,1,0,0,0},{0,1,0,1,0,0},{0,0,0,0,0,1}。
今天试图用c语言实现该算法,但是总也调不出来。请大虾帮忙!我的程序代码如下:
#include <stdio.h>
int isLegal(int a[],int c[],int n,int y){
int i;
int sum=0;
for(i=0;i<n;i++){
if(c[i]==1){
sum=sum+a[i];
}
}
if(sum==y){
return 1;
}else{
return 0;
}
}
int isPart(int a[],int c[],int n,int y){
int i;
int sum=0;
for(i=0;i<n;i++){
if(c[i]==1){
sum=sum+a[i];
}
}
if(sum<y){
return 1;
}else{
return 0;
}
}
int partition(int A[],int c[],int n,int y){
int k,j;
int flag=0;
for(k=0;k<n;k++){
c[k]=-1;
}
k=0;
while(k>=0){
while(c[k]<=0){
c[k]=c[k]+1;
if(isLegal(A,c,n,y)){
flag=1;
/*储存或输出解向量*/
printf("\n");
for(j=0;j<n;j++){
printf("%d ",c[j]);
}
break;
}
else if(isPart(A,c,n,y)){
k=k+1;
printf("aaaaa\n");
}
}
c[k]=-1;
k=k-1;
}
return flag;
}
void main(){
int A[6]={10,20,30,40,50,60};
int flag=0;
int c[6]={-1,-1,-1,-1,-1,-1};
flag=partition(A,c,6,60);
if(flag){
printf("find the answer!");
}
else{
printf("can not find the answer!");
}
getch();
}