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

 

posted @ 2010-08-05 22:59  勇泽  阅读(233)  评论(0编辑  收藏  举报