Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t=4, n=6, and the list is [4,3,2,2,1,1], then there are four different sums that equal 4: 4,3+1,2+2, and 2+1+1.(A number can be used within a sum as many times as it appears in the list, and a single number counts as a sum.) Your job is to solve this problem in general.
4 6 4 3 2 2 1 1 5 3 2 1 1 400 12 50 50 50 50 50 50 25 25 25 25 25 25 0 0
Sums of 4: 4 3+1 2+2 2+1+1 Sums of 5: NONE Sums of 400: 50+50+50+50+50+50+25+25+25+2550+50+50+50+50+25+25+25+25+25+25
题意:输入n,m,和m个数,求m个数的其中一些或者全部相加是否可以等于n,如果可以,从大到小输
出这些数
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,m,a[15],num[15],b[15],flag; bool cmp(int x,int y) { return x>y; } void dfs(int x,int y,int sum) { if(num[m]-num[x-1]<sum) //把后面的数全部加上还是比要求的数小,则不可能 return; if(sum==0) //找到结果输出 { flag=1; printf("%d",b[1]); for(int i=2; i<y; i++) printf("+%d",b[i]); printf("\n"); return; } for(int i=x; i<=m; i++) { if(a[i]<=sum) { b[y]=a[i]; dfs(i+1,y+1,sum-a[i]); while(i+1<=m&&a[i]==a[i+1])//同一个位置如果填相同的数势必会重复 i++; } } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; flag=0; memset(b,0,sizeof(b)); num[0]=0; for(int i=1; i<=m; i++) scanf("%d",&a[i]); sort(a+1,a+1+m,cmp); //从大到小排序 for(int i=1; i<=m; i++) num[i]=num[i-1]+a[i];//每一个数及它前面数的和 printf("Sums of %d:\n",n); if(num[m]<n) //所有的数相加比n还小,则不可能 { printf("NONE\n"); continue; } dfs(1,1,n); if(flag==0) printf("NONE\n"); } return 0; }