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

 

你可能感兴趣的:(poj)