#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int num[15]; //初始读入的那几个数
int n,aim; //初始读入了几个数、以及t
int ans[15],a_len; //记录每个符合的结果,每发现一个完整的符合情况,则用P()整合到struct B中
struct B
{
int ans[15];
int len;
}yes[1011];
int key; //记录struct B里面有几个符合的情况
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) //DFS
{
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,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); //初始传递的k为-1。
if(!key) printf("NONE\n"); //key==0,则没有发现符合的情况
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++)
{
if(yes[i].len!=yes[i-1].len) flag=0;
else
{
flag=1;
for(l=0;l<yes[i].len;l++) if(yes[i].ans[l]!=yes[i-1].ans[l]) {flag=0;break;}
}
//flag==1,亮了,则与前一组重复了;否则没有重复,可以输出。
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;
}
hdu1258temp
最新推荐文章于 2020-03-03 16:18:16 发布