1873: This offer(zzuli)

题目描述

话说WX入职已经有一个多月了,公司boss突然扔给他了一个问题,如果解决不了的话就会被开除掉 - -#,情急之下他只能来请教你了,boss给了他N个不大于100的数,现在wx需要将这N个数通过在两两间添上‘+’或‘-’,最后合成为一个数,注意数字的顺序不能被改变,不同的方式会得到不同的结果,boss想要知道最后一共能得到多少种不同的结果

输入

输入案例有多组,每组数据占两行,第一行输入一个整数,即N1<=n<=20),第二行输入N个数Ai0<= 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时,记录了每一个结果,总是时间超限,哎,心痛。好不容易知道了怎么弄,,,最终还是白了

原文地址:https://www.cnblogs.com/kangdong/p/8868137.html