/*
分析:
如果用记录所有情况,最后输出的方法的话,
那么要注意输出没组的时候,要和前面的所有组
进行是否相同的判断。
2012-07-20
*/
分析:
如果用记录所有情况,最后输出的方法的话,
那么要注意输出没组的时候,要和前面的所有组
进行是否相同的判断。
2012-07-20
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int num[15];
int n,aim;
int ans[15],a_len;
struct B
{
int ans[15];
int len;
}yes[1011];
int key;
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
void P()
{
int i;
if(a_len<=0) return ;
for(i=0;i<a_len;i++) yes[key].ans[i]=ans[i];
yes[key].len=a_len;
key++;
}
void DFS(int k,int sum)
{
int i;
if(sum==aim) {P();return ;}
if(sum>aim) return ;
for(i=k+1;i<n;i++)
{
if(sum+num[i]<=aim)
{
ans[a_len++]=num[i];
DFS(i,sum+num[i]);
a_len--;
}
}
}
int main()
{
int i,j,l;
int flag;
while(scanf("%d%d",&aim,&n),n)
{
for(i=0;i<n;i++) scanf("%d",&num[i]);
qsort(num,n,sizeof(num[0]),cmp);
printf("Sums of %d:\n",aim);
a_len=0;
key=0;
DFS(-1,0);
if(!key) printf("NONE\n");
else
{
printf("%d",yes[0].ans[0]);
for(l=1;l<yes[0].len;l++) printf("+%d",yes[0].ans[l]);
printf("\n");
for(i=1;i<key;i++)
{
flag=0;
for(j=0;!flag&&j<i;j++)
{
if(yes[i].len!=yes[j].len) continue;
else
{
flag=1;
for(l=0;l<yes[i].len;l++) if(yes[i].ans[l]!=yes[j].ans[l]) {flag=0;break;}
}
}
if(flag) continue;
printf("%d",yes[i].ans[0]);
for(l=1;l<yes[i].len;l++) printf("+%d",yes[i].ans[l]);
printf("\n");
}
}
}
return 0;
}