题目大意:给定由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; }