原题连接
http://wenku.baidu.com/view/3db1ebd4195f312b3169a5aa.html
解法参考链接
http://blog.csdn.net/microsues/article/details/6603414
我的C语言实现
/*
在n个数中找到和为t的所有组合,设计一个高效算法
http://wenku.baidu.com/view/3db1ebd4195f312b3169a5aa.html
*/
#include <stdio.h>
#include <stdlib.h>
#define N 80
int numArray[N] = {3,4,1,2,2,1};
int isTravelled[N] = {0};
int n = 0;
int t = 0;
int find_pos_and_restSum(const int pos,const int restSum)
{
//pos是剩下的数中的第一个,pos最大是n-1
//pos=n时说明没有数了,如果0!=restSum,说明不存在
if(pos>n) //等价于 if(pos==n && 0!=restSum)
return 1;
if(0==restSum)
{
int i;
for(i=0;i<n;i++)
{
if(isTravelled[i]==1)
printf("%d ",numArray[i]);
}
printf("\n");
return 0;
}
//restSum!=0时
int j;
for(j=pos;j<n;j++)
{
//确保新的restSum>=0
if(numArray[j]>restSum)
continue;
isTravelled[j] = 1;
find_pos_and_restSum(j+1,restSum-numArray[j]);/*错误1:将j+1写成pos+1*/
isTravelled[j] = 0;
while(j<n-1 && numArray[j]==numArray[j+1])/*错误2:将n-1写成pos-1*/
j++;
}
if(numArray[j-1]>restSum)
return 2;
else
return 0;
}
int cmp(const void * a,const void * b)
{
return *((int *)b)-*((int *)a);
}
int main()
{
t = 4;//sum
n = 6;//length of numArray
//排序
qsort(numArray,n,sizeof(int),cmp);
//回溯
int result = find_pos_and_restSum(0,t);
if(1==result)
printf("1 no compared number group.\n");
else if(2==result)
printf("2 no compared number group.\n");
return 0;
}