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;
}