/*DFS,这道题主要是去掉重复的等式,网上看了大神的方法- -,说是用叶子来判重- -。表示看不懂,回头再去理解,土方法,全部找出来再判断*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#include<vector>
#define N 14
using namespace std;
bool Cmp(const int &a,const int &b)
{
return a>b;
}
int lis[N];
int vis[N];
int n,t,find,mark;
//multiset是允许重复元素的,用来存放一组等式
typedef multiset<int,greater<int> > Elem;
//set不允许重复元素,用来等式判重
set<Elem> se;
void dfs(int len,int v,int index)
{
int i;
if (len==t)
{
Elem tmp;
for (i=0;i<n;i++)
{
if (vis[i])
tmp.insert(lis[i]);
}
se.insert(tmp);
return;
}
for (i = v;i<n;i++)
{
if (lis[i]+len<=t && !vis[i])
{
vis[i] = 1; //表示没有用过
dfs(lis[i]+len,i,index+1);
vis[i] = 0;//回溯还原
}
}
}
int main()
{
int i;
while(cin>>t>>n && n)
{
for (i=0;i<n;i++)
cin>>lis[i];
sort(lis,lis+n,Cmp);
memset(vis,0,sizeof(vis));
lis[N-1] = 1;
cout<<"Sums of "<<t<<":"<<endl;
dfs(0,0,0);
if(se.empty())cout<<"NONE"<<endl;
else
{
//要用reverse_iterator遍历器。上面放入的时候是反着放的
for(set<Elem >::reverse_iterator it1= se.rbegin();it1 != se.rend();it1++)
{
int flag=1;
for(Elem::const_iterator it2=it1->begin();it2 != it1->end();it2++)
//必须要用const_iterator,否则编译不通过
{
cout<<(flag==0?flag=0,"":"+");
cout<<*it2;
}
cout<<endl;
}
}
se.clear();
}
return 0;
}