要注意的就是 处理 相同的数字;
/*
*HDU 1258
*fuqiang11
*DFS
*2013/7/28
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define maxn 13
using namespace std;
int T,N;
int a[maxn];
int visit[maxn];
int flag;
int cmp(int x, int y)
{
return x > y;
}
void DFS(int sum, int pos)
{
if(sum == T)
{
flag = 1;
int p = 0;
for(int i = 1; i <= N; i++)
{
if(visit[i]==1)
{
if(p)
cout<<"+";
cout<<a[i];
p = 1;
}
}
cout<<endl;
return ;
}
for(int i = pos; i <= N; i++)
{
if(visit[i]==0 && sum + a[i] <= T)
{
visit[i] = 1;
DFS(sum+a[i],i+1);
visit[i] = 0;
}
while(i<=N && a[i]==a[i+1])
i++;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
while(cin>>T && T)
{
cin>>N;
memset(visit, 0, sizeof(visit));
for (int i = 1; i <= N; i++)
{
cin>>a[i];
if(a[i] > T)
visit[i] = -1;
}
cout<<"Sums of "<<T<<":"<<endl;
flag = 0;
sort(a+1,a+N+1,cmp);
DFS(0,1);
if(!flag)
cout<<"NONE"<<endl;
}
}