题目描述
话说WX入职已经有一个多月了,公司boss突然扔给他了一个问题,如果解决不了的话就会被开除掉 - -#,情急之下他只能来请教你了,boss给了他N个不大于100的数,现在wx需要将这N个数通过在两两间添上‘+’或‘-’,最后合成为一个数,注意数字的顺序不能被改变,不同的方式会得到不同的结果,boss想要知道最后一共能得到多少种不同的结果
输入
输入案例有多组,每组数据占两行,第一行输入一个整数,即N(1<=n<=20),第二行输入N个数Ai(0<= Ai <= 100)
输出
对于每组数据,输出最终能得到的结果数
样例输入
3 1 2 4 4 1 2 2 3
样例输出
4 6
1 #include<iostream> 2 #include<algorithm> 3 #include<numeric> 4 #include<cstring> 5 using namespace std; 6 int n, k, a[1000], b[5000]; 7 void dfs(int i, int Sum) 8 { 9 if (i == n) 10 { 11 b[Sum] = 1; return; 12 } 13 dfs(i + 1, Sum + a[i]); 14 dfs(i + 1, Sum - a[i]); 15 } 16 int main() 17 { 18 while (~scanf("%d",&n)) 19 { 20 k = 0; 21 for (int i = 0; i < n; i++) 22 cin >> a[i]; 23 memset(b,0,sizeof(b)); 24 dfs(1,2000+ a[0]); 25 int ans = 0; 26 for (int i = 0; i < 5000; i++) 27 if (b[i]) ans++; 28 printf("%d ", ans); 29 } 30 return 0; 31 }
//在处理得到的每一个sum时,记录了每一个结果,总是时间超限,哎,心痛。好不容易知道了怎么弄,,,最终还是白了