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

 

posted @ 2010-08-07 15:34  勇泽  阅读(250)  评论(0编辑  收藏  举报