一道简单的搜索题——找等式

Description

给出一个正整数集合,如果取出其中一些数字,能够使这几个数字相加,等于集合中的一个数,就说明满足一个等式。比如集合{1,2,3,4,6},1+2=3,1+2+3=6都符合题意,但是1+3+4=2+6不符合题意。

Input

输入数据有多组。

第一行输入一个n(3<=n<=15),n表示这个正整数集合有多少个数;

第二行输入这n个整数(这n个数是按递增顺序输入的)。

Output

对于每个正整数集合,找出其中满足题意的等式个数,输出结果。

Sample Input

3
1 2 3
6
1 2 3 4 5 6

Sample Output

1
7

HINT


解题思路:

由于给定的数是按递增顺序输入的,所以就一个一个数取出来,搜索一遍,看它前面的数能不能相加等于这个数。

比如1 2 3 4,由于是集合,所以直接从第三个数开始,取出3,满足的式子只有一个1+2=3;

然后再取出4,满足的也只有一个,1+3=4。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn = 20 ;

int  arr[maxn] ;

int dfs(int sum,int p)
{
    int temp = 0;
    if(sum == 0) return 1;
    if(sum < 0 || p < 0) return 0;

    for(int i = p ; i >= 0 ; i--)
    {
        sum  -= arr[i] ;
        temp += dfs(sum,i-1);
        sum  += arr[i];
    }
    return temp;
}


int main()
{
    //freopen("in.txt","r",stdin);
    int n , ans ;
    while(cin>>n)
    {
        for(int i = 0; i < n ; i++)
            cin>>arr[i];

        ans = 0;

        for(int i = 2; i < n ; i++)
            ans += dfs(arr[i],i-1);

        cout<<ans<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值