The Balance HDU - 1709 母函数(板子变化)

题意:

现在你被要求用天平和一些砝码来量一剂药。当然,这并不总是可以做到的。所以你应该找出那些不能从范围[1,S]中测量出来的品质。S是所有重量的总质量。

输入一个n,后面有n个数,表示这n个物品的质量

 

题解:

注意这个题的题干,这个天平只要能制造出来那个质量差,然后这个质量差就不会输出(看懂第二个样例就行)

 

这道题是母函数的变化版,没学过母函数的可以看一下:母函数 <普通母函数(HDU - 1028 ) && 指数型母函数(hdu1521)> 

 

代码:

 1 #include<iostream>
 2 #include<queue>
 3 #include<vector>
 4 #include<string.h>
 5 #include<stdio.h>
 6 #include<queue>
 7 #include<algorithm>
 8 using namespace std;
 9 typedef long long ll;
10 const int maxn=105;
11 int c1[maxn*maxn],c2[maxn*maxn],v[maxn];
12 int main()
13 {
14     int n;
15     queue<int>r;
16     while(~scanf("%d",&n))
17     {
18         int sum=0;
19         memset(c1,0,sizeof(c1));
20         memset(c2,0,sizeof(c2));
21         for(int i=1;i<=n;++i)
22         {
23             scanf("%d",&v[i]);
24             sum+=v[i];
25         }
26         c1[0]=1;
27         for(int i=1;i<=n;++i)
28         {
29             for(int j=0;j<=sum;++j)
30             {
31                 for(int k=0;k+j<=sum && k<=v[i];k+=v[i])
32                 {
33                     if(j>k) c2[j-k]+=c1[j];
34                     else c2[k-j]+=c1[j];
35                     c2[k+j]+=c1[j];
36                 }
37             }
38             for(int j=0;j<=sum;++j)
39                 c1[j]=c2[j];//,c2[j]=0;
40         }
41         for(int i=1;i<=sum;++i)
42         {
43             if(!c1[i])
44                 r.push(i);
45         }
46         printf("%d\n",r.size());
47         int flag=0;
48         while(!r.empty())
49         {
50             if(!flag)
51             printf("%d",r.front()),flag=1;
52             else printf(" %d",r.front());
53             r.pop();
54         }
55         if(flag)
56         printf("\n");
57     }
58     return 0;
59 }

 

posted @ 2020-05-14 21:14  kongbursi  阅读(153)  评论(0编辑  收藏  举报