居然没超时 ... ps:index 是关键字么 ...
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int t,n,flag,ll;
int a[14],vis[14];
char pr[1000][100];
//int f[15]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096};
int cmp(const void *a,const void *b)
{
return (*(int *)a)<(*(int *)b)? 1:-1;
}
void pri()
{
int kk=0;
char st[100];
for(int i=0;i<n;i++)
if(vis[i])
{
int temp=a[i];
while(temp!=0)
{
st[kk++]=temp%10-'0';
temp/=10;
}
}
st[kk++]='\0';
for(int i=0;i<ll;i++)
if(strcmp(st,pr[i])==0) return ;
strcpy(pr[ll++],st);
kk=0;
for(int i=0;i<n;i++)
if(vis[i]) { if(!kk) printf("%d",a[i]),kk=1;else printf("+%d",a[i]); }
printf("\n");
}
void dfs(int sum,int k)
{
if(sum==t){ flag=1; pri(); return ;}
if(sum>t) return ;
for(int i=k;i<n;i++)
if(!vis[i])
{
vis[i]=1;
dfs(sum+a[i],i+1);
vis[i]=0;
}
}
int main()
{
while(scanf("%d %d",&t,&n)!=EOF&&n)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
printf("Sums of %d:\n",t);
memset(vis,0,sizeof(vis));
qsort(a,n,sizeof(a[0]),cmp);
ll =0;flag=0;
dfs(0,0);
if(!flag)
printf("NONE\n");
}
return 0;
}