Balance--POJ 1837

1、题目类型:DP、01背包问题的扩展。

2、解题思路:DP递推式:

    for i=1...G

      for j=min...max

        for k=1...C

           DP[i][j]=DP[i][j]+DP[i-1][j-hook[k]*goods[i]]

  其中 i 表示第 i 个物品,j 表示天平当前总重量,k表示第 k 个挂钩,DP[][]表示可能的次数。

3、注意事项:注重DP状态的选择,其他选择容易出现TLE、MLE。

4、实现方法:

  
    
#include < iostream >
using namespace std;

int hook[ 21 ],goods[ 21 ];
int dp[ 21 ][ 15100 ];

int main()
{
int i,j,k,C,G;
cin
>> C >> G;
for (i = 1 ;i <= C;i ++ )
cin
>> hook[i];
for (i = 1 ;i <= G;i ++ )
cin
>> goods[i];
dp[
0 ][ 7500 ] = 1 ;
for (i = 1 ;i <= G;i ++ )
{
for (j =- 7500 ;j <= 7500 ;j ++ )
{
for (k = 1 ;k <= C;k ++ )
{
if (j + 7500 >= hook[k] * goods[i])
dp[i][j
+ 7500 ] += dp[i - 1 ][j + 7500 - hook[k] * goods[i]];
}
}
}
cout
<< dp[G][ 7500 ] << endl;
return 1 ;
}

 

你可能感兴趣的:(poj)