http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2002
Description
所谓幂集,就是原集合中所有子集构成的集合,例如集合{1,2,3}的幂集为{{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3},{空集}}。现有一个元素个数为n的集合A={a1,a2,a3,a4……an},请求出集合A的幂集中有多少个 子集的和等于整数x。
Input
有多组测试数据处理到文件结束,每组数据第一行包含两个整数n(n<=30)和x(x>0);
第二行有n个整数,0
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[10000];
int main ()
{
int a[305];
int n,x;
int sum;
while(~scanf("%d%d",&n,&x))
{
sum=0;
int sum1=0;
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
sum1+=a[i];
}
if(sum1<x)
{
printf("0\n");
continue;
}
if(sum1==x)
{
printf("1\n");
continue;
}
if(x<a[0])
{
printf("0\n");
continue;
}
sort(a,a+n);
int flag=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
flag++;
if(a[i]>=x)
{
break;
}
}
for(int i=0; i<flag; i++)
{
for(int j=sum; j>=0; j--)
{
if(dp[j]>0) dp[j+a[i]]+=dp[j];
if(j==a[i]) dp[j]++;
}
}
printf("%d\n",dp[x]);
}
return 0;
}