1 #include<map> 2 #include<string> 3 #include<cstdio> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 #define MAXN 20 8 using namespace std; 9 int a[MAXN], temp[MAXN], vis[MAXN]; 10 int T, N, flag, sum; 11 string ss; 12 char str[MAXN]; 13 map<string, int>mp; 14 bool cmp(int a, int b){return a > b;} 15 void dfs(int dep, int idx){ 16 if(sum > T) return; 17 if(idx == N && sum != T) return; 18 if(sum == T){ 19 flag ++; 20 if(flag == 1) printf("Sums of %d: ", T); 21 for(int i = 0; i < dep; i ++) str[i] = temp[i]; 22 ss.clear(); 23 ss = str; 24 mp[ss]++; 25 if(mp[ss] == 1){ 26 for(int i = 0; i < dep-1; i ++) printf("%d+", temp[i]); 27 printf("%d ", temp[dep-1]); 28 } 29 return; 30 } 31 for(int i = idx; i < N; i ++){ 32 if(!vis[i]){ 33 vis[i] = 1; 34 temp[dep] = a[i]; 35 sum += a[i]; 36 dfs(dep+1, i+1); 37 sum -= a[i]; 38 vis[i] = 0; 39 } 40 } 41 } 42 int main(){ 43 int tt; 44 /* freopen("in.c", "r", stdin); */ 45 while(~scanf("%d%d", &T, &N) && N+T){ 46 tt = 0; 47 memset(vis, 0, sizeof(vis)); 48 for(int i = 0; i < N; i ++) scanf("%d", a+i),tt += a[i]; 49 if(tt < T){ 50 printf("Sums of %d: NONE ", T); 51 continue; 52 } 53 sort(a, a+N, cmp); 54 mp.clear(); 55 sum = flag = 0; 56 dfs(0, 0); 57 if(!flag) printf("Sums of %d: NONE ", T); 58 } 59 return 0; 60 }