HDOJ 1258
2014-04-30 18:38
330 查看
#include<map> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 20 using namespace std; int a[MAXN], temp[MAXN], vis[MAXN]; int T, N, flag, sum; string ss; char str[MAXN]; map<string, int>mp; bool cmp(int a, int b){return a > b;} void dfs(int dep, int idx){ if(sum > T) return; if(idx == N && sum != T) return; if(sum == T){ flag ++; if(flag == 1) printf("Sums of %d:\n", T); for(int i = 0; i < dep; i ++) str[i] = temp[i]; ss.clear(); ss = str; mp[ss]++; if(mp[ss] == 1){ for(int i = 0; i < dep-1; i ++) printf("%d+", temp[i]); printf("%d\n", temp[dep-1]); } return; } for(int i = idx; i < N; i ++){ if(!vis[i]){ vis[i] = 1; temp[dep] = a[i]; sum += a[i]; dfs(dep+1, i+1); sum -= a[i]; vis[i] = 0; } } } int main(){ int tt; /* freopen("in.c", "r", stdin); */ while(~scanf("%d%d", &T, &N) && N+T){ tt = 0; memset(vis, 0, sizeof(vis)); for(int i = 0; i < N; i ++) scanf("%d", a+i),tt += a[i]; if(tt < T){ printf("Sums of %d:\nNONE\n", T); continue; } sort(a, a+N, cmp); mp.clear(); sum = flag = 0; dfs(0, 0); if(!flag) printf("Sums of %d:\nNONE\n", T); } return 0; }