1873: This offer
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 210 Solved: 52
Submit Status Web Board
Description
话说WX入职已经有一个多月了,公司boss突然扔给他了一个问题,如果解决不了的话就会被开除掉 - -#,情急之下他只能来请教你了,boss给了他N个不大于100的数,现在wx需要将这N个数通过在两两间添上‘+’或‘-’,最后合成为一个数,注意数字的顺序不能被改变,不同的方式会得到不同的结果,boss想要知道最后一共能得到多少种不同的结果
Input
输入案例有多组,每组数据占两行,第一行输入一个整数,即N(1<=n<=20),第二行输入N个数Ai(0<= Ai <= 100)
Output
对于每组数据,输出最终能得到的结果数
Sample Input
31 2 441 2 2 3
Sample Output
46
HINT
Source
Anything about the Problems, Please Contact us
GPL2.0 2003-2014 Base On HUSTOJ Project
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n;
int a[50];
int p[4005];
void dfs(int sum,int i)
{
if(i==n)
{
p[sum+2000]=1;
return;
}
dfs(sum+a[i],i+1);
dfs(sum-a[i],i+1);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
dfs(a[0],1);//因为第一个数肯定是正的,所以从第二个数开始进行加或者减
int cnt=0;
for(int i=0;i<=4000;i++)
{
if(p[i])
{
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}