hdu 1709
题意:已知有N个不同的砝码,求这N个不同砝码不能称量的重量
分析:与一般的母函数类似,只是还要多考虑一步,就是砝码并不定都放一边
for(int i=1;i<=n;i++)
{
for(int j=0;j<=maxn;j++)
{
if(j+p[i]<=maxn)
num1[j+p[i]]+=num[j];
num1[abs(j-p[i])]+=num[j];//核心部分都加了这么一句
}
for(int j=0;j<=maxn;j++)
num[j]=num1[j];
}
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int num1[10010],num[10010],n;
int p[110],ans[11000],maxn;
void solve()
{
memset(num1,0,sizeof(num1));
memset(num,0,sizeof(num));
num1[0]=num[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=maxn;j++)
{
if(j+p[i]<=maxn)
num1[j+p[i]]+=num[j];
num1[abs(j-p[i])]+=num[j];
}
for(int j=0;j<=maxn;j++)
num[j]=num1[j];
}
}
int main()
{
while(scanf("%d",&n)==1)
{
maxn=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
maxn+=p[i];
}
solve();
int c=0;
for(int i=1;i<=maxn;i++)
{
if(num[i]==0)
ans[c++]=i;
}
printf("%d\n",c);
if(c!=0)
{
printf("%d",ans[0]);
for(int i=1;i<c;i++)
printf(" %d",ans[i]);
printf("\n");
}
}
return 0;
}

浙公网安备 33010602011771号