总时间限制:
10000ms
单个测试点时间限制:
1000ms
内存限制:
262144kB
描述
给定N个正整数A1, A2, ... AN,从中挑出若干个数(至少一个最多N个),问这若干个数的和有多少种不同的可能。
例如对于1, 2, 3能组成的和有1, 2, 3, 4, 5, 6一共6种可能。
输入
第一行包含一个整数N。
第二行包含N个正整数A1, A2, ... AN。
1 <= N <= 20 1 <= Ai <= 100
输出
一个整数代表答案
样例输入
3 1 2 3
样例输出
6
代码:
#include<bits/stdc++.h> using namespace std; int n,a[25],b[25],ans=0; bool cnt[2005]; int main(){ cin>>n; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<1<<n;i++){ for(int j=0;j<n;j++) b[j]=(i>>j)&1; int sum=0; for(int j=0;j<n;j++) if(b[j]==1) sum+=a[j]; cnt[sum]=true; } for(int i=1;i<=2000;i++){ if(cnt[i]) ans++; } cout<<ans<<endl; return 0; }