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;
}
原文地址:https://www.cnblogs.com/nanke/p/2233677.html