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编辑  收藏  举报

导航