给出一个数,然后还有好几个数,让你求出来。怎么从后边的这些数相加得到给出的这个数。 /*dfs 仅仅找出答案比较容易,判重的话,可以把所有搜到的答案都存下来。然后判断输出。 * 这个是看到别人的方法。每次把这个结点和上一个叶子结点做比较。如果相同的,是相同解。就要省略掉。 * * */ #include <stdio.h> #include <iostream> #include <string.h> using namespace std; #define MAXN 1005 int m,n,ans; int a[MAXN]; int result[MAXN]; int count; int flag ; int mark; void dfs(int k) { if(ans==n) { flag = 1; for(int i=0;i<count;i++) { if(i) cout<<'+'; cout<<result[i]; } cout<<endl; return; } if(ans>n) return ; if(k>=m) return ; if(a[k]!=mark) { ans+=a[k]; result[count++]=a[k]; dfs(k+1); ans-=a[k]; count--; } mark = a[k]; dfs(k+1); } int main(void) { //freopen("in","r",stdin); //freopen("out_my","w",stdout); while(scanf("%d %d",&n,&m)!=EOF) { if(!n&&!m) break; for(int i=0;i<m;i++) cin>>a[i]; flag = 0; mark= 0; printf("Sums of %d:/n",n); ans = 0; count = 0; dfs(0); if(!flag ) printf("NONE/n"); } return 0; }