Description
话说WX入职已经有一个多月了,公司boss突然扔给他了一个问题,如果解决不了的话就会被开除掉 - -#,情急之下他只能来请教你了,boss给了他N个不大于100的数,现在wx需要将这N个数通过在两两间添上‘+’或‘-’,最后合成为一个数,注意数字的顺序不能被改变,不同的方式会得到不同的结果,boss想要知道最后一共能得到多少种不同的结果
Input
输入案例有多组,每组数据占两行,第一行输入一个整数,即N(1<=n<=20),第二行输入N个数Ai(0<= Ai <= 100)
Output
对于每组数据,输出最终能得到的结果数
Sample Input
3
1 2 4
4
1 2 2 3
Sample Output
4
6
第一次做搜索,其实这是个简单题,搜索一般通过递归来实现。
哈哈 大神教的,先上代码
#include <iostream>
#include<string.h>
using namespace std;
int a[4010],n,b[4010];
void digui(int index,int shu) {
if(index==n) {
b[shu]=1;
} else {
shu+=a[index];
digui(index+1,shu);
shu-=a[index]*2;
digui(index+1,shu);
}
}
int main() {
int i,count;
while(cin>>n) {
count=0;
memset(b,0,sizeof(b));
for(i=0; i<n; i++)
cin>>a[i];
digui(1,2000+a[0]);
for(i=0; i<=4000; i++)
if(b[i])
count++;
cout<<count<<endl;
}
return 0;
}
分析题意,我们可以用类似于桶排序的方法,用下标存结果值,然后该数组对应的值为是否有该结果,有则值为1,否则为0。
digui(1,2000+a[0]); //这个语句,是递归的起点
为什么要传个2000+a[0]进去呢,题中N(1<=n<=20),Ai(0<= Ai <= 100) 因此结果值最小为-2000,那我们把结果值+2000问题就解决啦~