Charm Bracelet--POJ 3624

1、题目类型:01背包问题,DP。

2、解题思路:DP递推式:

    for i=1...N

      for j=M...1

         DP[j]=max{DP[j],DP[j-W[i]]+D[i]}

  其中 i 表示第 i 个物品,j 表示当前背包的重量。

3、注意事项:DP用一维数组表示,否则MLE;j 的循环从M...1,用于同一数组保存 i-1时DP[j]的值。

4、实现方法:

  
    
#include < iostream >
using namespace std;

#define Maxn 3410
#define Maxm 12889
int W[Maxn],D[Maxn],DP[Maxm];

int GetMax( int x, int y)
{
return x > y ? x:y;
}

int main()
{
int n,m,i,j;
cin
>> n >> m;
for (i = 1 ;i <= n;i ++ )
cin
>> W[i] >> D[i];
for (i = 1 ;i <= n;i ++ )
{
for (j = m;j > 0 ;j -- )
{
if (j - W[i] >= 0 )
DP[j]
= GetMax(DP[j],DP[j - W[i]] + D[i]);
else
DP[j]
= DP[j];
}
}
cout
<< DP[m] << endl;
return 1 ;
}

 

你可能感兴趣的:(char)