地址:http://acm.hdu.edu.cn/showproblem.php?pid=1171
题意:有n样物品,每样物品价值是v,件数是m。尽量把这些物品分成两堆使得两边总价值最接近。输出价值。
mark:水dp,或者用母函数搞。wa了3次,trick在于结束标记是负数,而非-1。
代码:
1 # include <stdio.h> 2 # include <string.h> 3 4 5 int dp[250010] ; 6 7 8 int main () 9 { 10 int i, j, k, sum ; 11 int n, m, v ; 12 while (~scanf("%d", &n)&&n>=0) 13 { 14 memset (dp, 0, sizeof (dp)) ; 15 dp[0] = 1, sum = 0 ; 16 for (i = 0 ; i < n ; i++) 17 { 18 scanf ("%d%d", &v, &m) ; 19 for (j = sum ; j >=0 ; j--)if (dp[j]&&dp[j+v]==0) 20 { 21 for (k = j+v ; k<= j+m*v ; k += v) 22 dp[k] = 1 ; 23 } 24 sum += v*m ; 25 } 26 for (j = sum/2 ; j>= 0 ; j--) if (dp[j]) break ; 27 printf ("%d %d\n", sum-j, j) ; 28 } 29 return 0 ; 30 }