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 }