题意:找到不重复的,加起来等于给定的数。

连接: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;
}