The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4751 Accepted Submission(s): 1900
Problem Description
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.
Input
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.
Output
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.
Sample Input
Sample Output
Source
HDU 2007-Spring Programming Contest
Recommend
lcy
本题给出一个带有若干个的砝码的天平,问[1,sum]总共有多少个质量不能称量。
本题是个组合数问题,问这些给定的数能组合出哪些数,当然本题背景决定可以通过减来组合。这是本题的亮点。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int num[100+10];
int n,sum;
int a[100*100+100];
int b[100*100+100];
inline void Solve()
{
int i,j,k;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
a[0]=1;
for(i=1;i<=n;i++)///枚举单个药剂质量
{
for(j=0;j<=sum;j++)//枚举被乘数的所有质量
{
for(k=0;k*num[i]+j<=sum&&k<=1;k++)
{
if(k*num[i]>j)b[k*num[i]-j]+=a[j];//
else b[j-k*num[i]]+=a[j];//想减的情况意味着放两边
b[k*num[i]+j]+=a[j];//相加的情况意味着放一边
}
}
memcpy(a,b,sizeof(b));
memset(b,0,sizeof(b));
}
}
int main()
{
int i,cnt,k;
while(~scanf("%d",&n))
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
Solve();
cnt=0;
for(i=1;i<=sum;i++)
{
if(!a[i])
{
cnt++;
}
}
printf("%d\n",cnt);
k=0;
for(i=1;i<=sum;i++)
{
if(!a[i]&&++k<cnt)
printf("%d ",i);
else if(!a[i]&&k==cnt)
printf("%d\n",i);
}
}
return 0;
}