2016郑州轻工业学院 玲珑杯热身赛 C题 This offer

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问题就解决啦~

你可能感兴趣的:(C语言)