sum it up
#include<stdio.h> #include<string.h> #include<stdlib.h> int N,M,dp[50],mark[50],flag; void DFS(int x,int sum) //sum为和,x为当前数组标号 { int i,k,j,flag1=0; if(sum==N) { for(i=0;i<M;i++) { if(mark[i]==1) { if(!flag1) printf("%d",dp[i]),flag1=1; else printf("+%d",dp[i]); } } puts(""); flag=1; return; } else for(j=x;j<M;j++) {
if((sum+dp[j])>N&&!mark[i]) continue; //如果大于N,就结束此次循环
if( j > x && dp[j] == dp[j-1] )//去掉重复的,题目给出我们是从大到小依次递减. continue; mark[j]=1; DFS(j+1,dp[j]+sum); mark[j]=0; } } int main( ) { while(scanf("%d%d",&N,&M),N||M) { int i,j; flag=0; for(i=0;i<M;i++) scanf("%d",&dp[i]); printf("Sums of %d:\n",N); memset(mark,0,sizeof(mark)); DFS(0,0); if(!flag) puts("NONE"); } return 0; }
posted on 2011-05-11 00:56 more think, more gains 阅读(181) 评论(0) 编辑 收藏 举报