Cash Machine--POJ 1276
1、题目类型:多重背包问题,DP。
2、解题思路:DP递推式:
for i=0...k
for j=cash...0
DP[j]=max{DP[j],DP[j-value[i]]+value[i]}
其中 i 表示第 i 个钱值,j 表示当前的cash值。
3、注意事项:多重背包转换为01背包时,k++、value[k]的控制;dp[]注意及时清空;注意value[]大小,避免RE。
4、实现方法:
#include<iostream>
using namespace std;
struct TBill{
int num,val;
};
TBill Bill[15];
int dp[100010],value[10010];
int main()
{
int cash,n,i,j,k;
while (cin>>cash>>n)
{
k=0;
for (i=0;i<n;++i)
{
cin>>Bill[i].num>>Bill[i].val;
j=1;
while (j<=Bill[i].num )
{
value[k++]=Bill[i].val*j;
Bill[i].num-=j;
j*=2;
}
if(Bill[i].num>0)
value[k++]=Bill[i].val*Bill[i].num;
}
memset(dp,0,sizeof(dp));
for (i=0;i<k;++i)
{
for (j=cash;j>=0;--j)
{
if (j-value[i]>=0)
dp[j]=dp[j]>dp[j-value[i]]+value[i] ? dp[j] : dp[j-value[i]]+value[i];
}
}
cout<<dp[cash]<<endl;
}
return 0;
}