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;
}

 

posted @ 2010-08-05 23:03  勇泽  阅读(173)  评论(0编辑  收藏  举报