Sum It Up
Posted ljhaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<<‘ ‘; 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<<": "; 72 dfs(1); 73 if(!flag) cout<<"NONE "; 74 } 75 }
以上是关于Sum It Up的主要内容,如果未能解决你的问题,请参考以下文章