杭电 HDU ACM 1709 The Balance
The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6304 Accepted Submission(s): 2592
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
3
1 2 4
3
9 2 1
Sample Output
0
2
4 5
这个题 丫的浪费好长时间 好几个小时 ,唉 都怪自己笨 ,用母函数来做,母函数部分算出所有可能组合出来的值得情况。假设先把最大值的组合情况放在左盘,从1
开始检测所有组合情况,这个最大值的来源有两种情况,case1:前面某些较小的砝码组合,case2:本身那个砝码就最大。对于case1:那个最大值组合减去其他某种组合
情况之一相当于 左盘减 右盘加!!对于 case2:相当于左盘不变,从砝码箱里取出其他砝码组合加入到右盘。
最坑人的是 超时好几次!稍微优化了一下,比规定时间少2毫秒!哈哈哈
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int cnt[100002],dic[100002];
int main()
{
int n,A[101];
while(scanf("%d",&n)!=EOF)
{
int Max=0;
for(int i=0; i<n; i++)
{
scanf("%d",&A[i]);
Max+=A[i];
}
for(int j=0; j<=Max; j++)
{
cnt[j]=0;
dic[j]=0;
}
cnt[0]=cnt[A[0]]=1;
for(int t=2; t<=n; t++)
{
for(int k=0; k<=Max; k++)
{
if(cnt[k])//如果前一对括号中某个指数的系数为0,那么即使乘以下一项,也不会给当前括号内某一项指数和为T的系数有效力
{
for(int h=0; h+k<=Max&&h<=A[t-1]; h+=A[t-1])
{
dic[k+h]+=cnt[k];
}
}
}
for(int p=0; p<=Max; p++)
{
cnt[p]=dic[p];
dic[p]=0;
}
}
int buff[Max+1];
memset(buff,0,sizeof(buff));
for(int q=Max; q>=1; q--)
{
if(cnt[q])
{
for(int f=1; f<=q; f++)
{
if(cnt[f])
{
if(f==q)
buff[q]=1;
else
buff[q-f]=1;
}
}
}
}
int ls[Max+1],r,count=0,t=0,flag=0;
memset(ls,0,sizeof(ls));
for(int a=1; a<=Max; a++)
{
if(!buff[a])
{
ls[t++]=a,count++;
flag=1;
}
}
if(!flag)
{
cout<<0<<endl;
continue;
}
cout<<count<<endl;
for( r=0; r<t-1; r++)
cout<<ls[r]<<" ";
cout<<ls[r]<<endl;
}
return 0;
}

浙公网安备 33010602011771号