题目大意:给出一个和,求出所给数相加等于这个和的所有不同情况
解决:The numbers in each list appear in nonincreasing order, and there may be repetitions.
有序是前提,由于有4 6 4 3 2 2 1 1这样的数据存在,我们必须判断重复的等式
6=3+2+1(第一个1)
或者是6=3+2+1(第二个1)
如何判断呢见代码
// #include <iostream> #include <cstdio> #include <cstring> using namespace std; int t,n,num[15],res[15]; bool flag; void dfs(int start,int current_step,int current_sum) { if(t==current_sum) { printf("%d",res[0]); for(int i=1;i<current_step;i++)printf("+%d",res[i]); printf("\n"); flag=true; return; } for(int i=start;i<n;i++) {//判重部分,同一层,除第一个不用判断外,其他的必须和第一个不一样,要不然式子相同了就 if( i==start || num[i]!=num[i-1]) { res[current_step]=num[i]; dfs(i+1,current_step+1,current_sum+num[i]); } } } int main() { while( scanf("%d%d",&t,&n),t||n ) { flag=false; memset(res,0,sizeof(res)); for(int i=0;i<n;i++)scanf("%d",&num[i]); printf("Sums of %d:\n",t); dfs(0,0,0); if(!flag)puts("NONE"); } system("pause"); return 0; }