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