题意:找到不重复的,加起来等于给定的数。
连接:http://acm.hdu.edu.cn/showproblem.php?pid=1258
View Code
#include <iostream> #include <algorithm> using namespace std; int used[15];//标记的数 int save[15];//保存更新的数 int step[15];//输入的数 int n,m; int sum,type; int cmp(int a,int b) { return a>b; } void dfs(int k,int x) { if(k==n) { if(sum<n) { return; } } if(sum==n)//输出 { type=1; printf("%d",save[0]); for(int i=1;i<k;i++) { printf("+%d",save[i]); } printf("\n"); return; } int last=-1;//判断是否和上一位数相同 for(int i=x;i<m;i++) { if(!used[i]) { if(step[i]!=last) { if(sum+step[i]>n)//判断和是否大于n,如果大于就继续。 { continue; } last=step[i]; used[i]=1; save[k]=step[i];//记录更新的数 sum+=step[i]; dfs(k+1,i); used[i]=0; sum-=step[i]; } } } return ; } int main() { while(scanf("%d%d",&n,&m),n+m) { memset(used,0,sizeof(used)); type=0; sum=0; for(int i=0;i<m;i++) { scanf("%d",&step[i]); } sort(step,step+m,cmp); printf("Sums of %d:\n",n); dfs(0,0); if(!type)//是否找到解,找不到就输出此数 { printf("NONE\n"); } } return 0; }