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

 

你可能感兴趣的:(mac)