POJ 1837 Balance 01背包

题目: http://poj.org/problem?id=1837

感觉dp的题目都很难做,这道题如果不看题解不知道憋到毕业能不能做出来,转化成了01背包问题,很神奇。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int dp[20][15000];
 5 int c[20], w[20];
 6 
 7 int main()
 8 {
 9     int n, m;
10     scanf("%d %d", &n, &m);
11     //天平上有n个砝码位置
12     for(int i = 1; i <= n; i++)
13     {
14         scanf("%d", &c[i]);
15     }
16     //有m和砝码
17     for(int i = 1; i <= m; i++)
18     {
19         scanf("%d", &w[i]);
20     }
21     
22     memset(dp, 0, sizeof(dp));
23     
24     //0到15000来表示-7500到7500,这样保证数组下标为正。不挂砝码时天平平衡方案为1
25     dp[0][7500] = 1;
26     
27     //挨个挂上每个砝码
28     for(int i = 1; i <= m; i++)
29     {
30         //枚举所有状态
31         for(int j = 0; j <= 15000; j++)
32         {
33             if(dp[i-1][j])
34             {
35                 for(int k = 1; k <= n; k++)
36                 {
37                     dp[i][j+c[k]*w[i]] += dp[i-1][j];
38                 }
39             }
40         }
41     }
42     printf("%d\n", dp[m][7500]);
43     return 0;
44 }
View Code

 

posted @ 2013-08-22 20:41  Anti-Magic  阅读(144)  评论(0编辑  收藏  举报