您的位置:首页 > 其它

The Balance 1709 (母函数 技巧(相加和相减)) 好题

2015-09-20 17:13 316 查看

The Balance

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 6802    Accepted Submission(s): 2796


[align=left]Problem Description[/align]
Now you are asked to measure a dose of medicine with a balance and a number of weights. Certainly it is not always achievable. So you should find out the qualities which cannot be measured from the range [1,S]. S is the total quality
of all the weights.

[align=left]Input[/align]
The input consists of multiple test cases, and each case begins with a single positive integer N (1<=N<=100) on a line by itself indicating the number of weights you have. Followed by N integers Ai (1<=i<=N), indicating the quality
of each weight where 1<=Ai<=100.

[align=left]Output[/align]
For each input set, you should first print a line specifying the number of qualities which cannot be measured. Then print another line which consists all the irrealizable qualities if the number is not zero.

[align=left]Sample Input[/align]

3
1 2 4
3
9 2 1

[align=left]Sample Output[/align]

0
2
4 5 //因为砝码可以放左边也可以放右边,(按左物右码规则),放左盘就取减号,放右盘就取加号,//最终要将指数看作为正数,所以,所有所求得的系数都要取绝对值。 
#include<stdio.h>
#include<string.h>
int a[10010],b[10010],c[110],d[10010];
int main()
{
int n,i,j,k,sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&c[i]);
sum+=c[i];
}
for(i=0;i<=sum;i++)
{
a[i]=0;
b[i]=0;
}
for(i=0;i<=c[1];i+=c[1])
a[i]=1;
for(i=2;i<=n;i++)
{
for(j=0;j<=sum;j++)
{
for(k=0;k+j<=sum&&k<=c[i];k+=c[i])
{
if(k>=j)
b[k-j]+=a[j];
else
b[j-k]+=a[j];
b[j+k]+=a[j];
}
}
for(j=0;j<=sum;j++)
{
a[j]=b[j];
b[j]=0;
}
}
int s=0;
for(i=0;i<=sum;i++)
{
if(a[i]==0)
{
d[s++]=i;
}
}
printf("%d\n",s);
if(s)
{
for(i=0;i<s-1;i++)
printf("%d ",d[i]);
printf("%d\n",d[s-1]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: