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