HDOJ 1258

#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; 
}

posted on 2014-04-30 18:38  wangzhili  阅读(111)  评论(0编辑  收藏  举报