地址:http://acm.hdu.edu.cn/showproblem.php?pid=1709
题意:给n个砝码的重量,问从1到重量总和中不能称出的重量的个数和分别都是谁。
mark:注意新砝码可以加在左盘也可以加在右盘。
代码:
1 # include <stdio.h> 2 # include <string.h> 3 4 5 int dp[10010] ; 6 int buff[10010] ; 7 int n ; 8 9 10 int abs(int a){return a<0?-a:a;} 11 12 int main () 13 { 14 int i, j, sum, num, ans, flag ; 15 while (~scanf("%d",&n)) 16 { 17 memset (dp,0,sizeof(dp)) ; 18 19 dp[0] = 1, sum = 0 ; 20 for(i = 0 ; i < n ; i++) 21 { 22 scanf("%d", &num) ; 23 memset (buff,0,sizeof(buff)) ; 24 for(j=0;j<=sum;j++) if (dp[j]) 25 { 26 buff[j+num] = 1 ; 27 buff[abs(j-num)] = 1 ; 28 } 29 sum += num ; 30 for(j=0;j<=sum;j++)if(buff[j]) 31 dp[j] = 1 ; 32 } 33 ans = 0 ; 34 for(i=1;i<=sum;i++)if(dp[i]==0) ans++ ; 35 printf ("%d\n", ans) ; 36 flag = 0 ; 37 for(i=1;i<=sum;i++)if(dp[i]==0) 38 { 39 if (flag == 0) flag = 1 ; 40 else printf(" ") ; 41 printf ("%d", i) ; 42 } 43 if (ans != 0) printf("\n") ; 44 } 45 return 0 ; 46 }