/*
此题要注意,每一种重量的砝码只有一个,而且称重量是用天平,这就意味这可以多出一些重量为负数的砝码
*/
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10001;
int a[202];
int c1[maxn];
int c2[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
int sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=-a[i];
sum+=a[i];
}
for(i=0;i<=sum;i++)
c1[i]=c2[i]=0;
c1[0]=c1[a[1]]=1;
for(i=2;i<=n;i++) //处理正数的砝码
{
for(j=0;j<=a[i];j+=a[i])
for(k=0;k<=sum;k++)
if(j+k<=sum)
c2[j+k]+=c1[k];
for(k=0;k<=sum;k++)
{
c1[k]=c2[k];
c2[k]=0;
}
}
for(i=n+1;i<=2*n;i++) //处理负数的砝码
{
for(j=0;j>=a[i];j+=a[i])
for(k=0;k<=sum;k++)
if(j+k<=sum&&j+k>=0)
c2[j+k]+=c1[k];
for(k=0;k<=sum;k++)
{
c1[k]=c2[k];
c2[k]=0;
}
}
int count=0;
for(i=1;i<=sum;i++)
if(!c1[i])
c2[count++]=i;
printf("%d/n",count);
i=0;
while(i<count-1)
printf("%d ",c2[i++]);
if(count!=0)
printf("%d/n",c2[count-1]);
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=1709
最新推荐文章于 2022-02-25 19:38:17 发布