您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1709

2010-11-12 22:57 316 查看
/*

此题要注意,每一种重量的砝码只有一个,而且称重量是用天平,这就意味这可以多出一些重量为负数的砝码

*/

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: