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 阅读(188) 评论(0) 收藏 举报
浙公网安备 33010602011771号