HDOJ --- 1258

 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 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3673283.html