您的位置:首页 > 其它

hdoj 1258 Sum It Up (递归回溯)

2011-02-19 23:59 309 查看
题目大意:给定由n(1<=n<=12)个数组成的非升序序列,求其中的任意组合使和等于给定的数.要求输出的结果不能重复,每个结果按非升序,且各个结果间按原序列的字典序.

思路:深搜递归回溯.

按序列的非升序去重复.

#include <iostream>
using namespace std;
int num[13],t[13];
int n,m,tot,len,flag;
void find(int start,int sum)
{
int i;
if(sum==tot){
flag=1;
for(i=0;i<len-1;i++)
printf("%d+",t[i]);
printf("%d\n",t[i]);
return ;
}
int tmp;
for(i=start;i<n;i++){
tmp=sum+num[i];
if(tmp>tot)
continue;
if(i>start && num[i]==num[i-1])
continue;
t[len++]=num[i];
find(i+1,tmp);
len--;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&tot,&n)!=EOF ,n,tot)
{
for(i=0;i<n;i++)
scanf("%d",&num[i]);
flag=0;
len=0;
printf("Sums of %d:\n",tot);
find(0,0);
if(!flag){
printf("NONE\n");
continue;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: