/*
题目:给出一定(n)数量的砝码,每个砝码重a1,a2,a3。。。an,
问题:求出【1~sum】中(sum为各砝码总和)不能被称出的重量;
问题关键:天平两边都可以放砝码,
放在同一端:a[j+k]+=a[j]不同端a[abs(j-k)]+=a[j]
假设原来的砝码都放在右端,则可以把新加的砝码放在左端,得到新重量,此时a[abs(j-k)]+=a[j]。
*/
# include <algorithm>
# include <string.h>
# include <stdio.h>
# include <math.h>
# include <iostream>
using namespace std;
int main()
{
int n,i,j,k,flag,cot;
int sum,c1[10010],c2[10010],num[110];
while(~scanf("%d",&n))
{
sum=0;
for(i=0; i<n; i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
for(i=0; i<=sum; i++)
{
c1[i]=0;
c2[i]=0;
}
for(i=0; i<=num[0]; i+=num[0])//第一种砝码
c1[i]=1;
for(i=1; i<n; i++)//第i个表达式
{
for(j=0; j<=sum; j++)
{
for(k=0; k<=num[i]; k+=num[i])
{
c2[k+j]+=c1[j];
c2[abs(k-j)]+=c1[j];
}
}
for(j=0; j<=sum; j++)
{
c1[j]=c2[j];
c2[j]=0;
}
}
cot=0;
for(i=1; i<=sum; i++)
if(c1[i]==0)
cot++;
printf("%d\n",cot);
flag=0;
if(cot)
{
for(i=1; i<=sum; i++)
{
if(!flag)
{
if(c1[i]==0)
{
printf("%d",i);
flag=1;
}
}
else
{
if(c1[i]==0)
{
printf(" %d",i);
}
}
}
printf("\n");
}
}
return 0;
}
hdu 1709 The Balance (母函数)
最新推荐文章于 2019-10-10 16:49:51 发布