Sum It Up

题目:https://vjudge.net/contest/277958#problem/G

题意:输入一个val和n,然后n个数,然后求n个数相加等于val的值。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 int cmp(int a,int b)
 8 {
 9     return a>b;
10 }
11 int sum,n;
12 int tail[10000];
13 bool book[10000];
14 bool flag;
15 int xulie[10000][20];
16 int num;
17 void print()
18 {
19     int xuli[20]={0};
20     int j = 0;
21     int s = 0;
22     for(int i = 1;i<=n;++i)
23     {
24         if(book[i]) {s+=tail[i];xuli[++j] = tail[i];}
25     }
26     if(s==sum)
27     {   bool pan = false;
28         for(int i = 1;i<=num;++i)
29         {
30             for(j = 1;j<=n;++j)
31                 if(xulie[i][j]!=xuli[j]) break;
32             if(j==n+1)  pan = true; //是否是重复过的
33         }
34          if(pan) return; //是重复的,则return
35          else
36         {
37             ++num;
38             for(int i = 1;i<=n;++i) xulie[num][i] = xuli[i];
39             flag = true;
40             int i;
41             for(i=1;i<=n;++i) if(book[i]) {cout<<tail[i]; break;}
42             for(++i;i<=n;++i) if(book[i]) cout<<"+"<<tail[i];
43             cout<<'\n';
44         }
45     }
46 }
47 void dfs(int i)
48 {
49     if(i==n+1)
50     {
51         print();
52         return;
53     }
54     // 新学到的dfs方式
55     book[i] = true;
56     dfs(i+1);
57     book[i] = false;
58     dfs(i+1);
59 }
60 int main()
61 {
62     while(~scanf("%d %d",&sum,&n)&&sum+n)
63     {
64         num = 0;
65         memset(book,false,sizeof(book));
66         memset(xulie,0,sizeof(xulie));
67         flag = false;                       //初始化 ↑
68         for(int i = 1;i<=n;++i)
69             scanf("%d",&tail[i]);
70         sort(tail+1,tail+n+1,cmp);         //提前排好序
71         cout<<"Sums of "<<sum<<":\n";
72         dfs(1);
73         if(!flag) cout<<"NONE\n";
74     }
75 }
View Code

 

posted @ 2019-02-24 19:58  里昂静  阅读(272)  评论(0编辑  收藏  举报