poj3624Charm Bracelet 01背包

经典动态规划题目,这个题目最开始用的书本的思想,用m[i][j]表示前i件物品重量不超过j的最大价值,则dp方程为:m[i+1][j]=max(m[i][j-w[i+1]]+p[i+1],m[i][j]),也就是从i+1件物品中得到重量不超过j的最大价值的时候,第i+1件要么选要么不选,但是这个题目由于w和n比较大,这么会MLE,所以必须缩小空间,由于m[i][j]只和当前i的重量和价值有关系,对于当前的物品我们要么选要么不选,我们直接用一维数组表示 dp[j]=max(dp[j-w[i]]+p[i],dp[j])。计算的时候要从后往前计算。

代码:

#include <iostream>
#include <stdio.h>
using namespace std;
const int MAXN=12883;
const int N=3404;
int w[N],p[N],dp[MAXN];
int getMax(int a,int b)
{
 return a>=b?a:b;
}
int main()
{
 int i,j,n,weight;
 scanf("%d%d",&n,&weight);
 for(i=1;i<=n;i++)
  scanf("%d%d",&w[i],&p[i]);
 memset(dp,0,sizeof(dp));
 for(i=1;i<=n;i++)
 {
  for(j=weight;j>=w[i];j--)
  {
   dp[j]=getMax(dp[j-w[i]]+p[i],dp[j]);
  }
 // cout<<dp[weight]<<endl;
 }
 printf("%d\n",dp[weight]);
 return 0;
}

你可能感兴趣的:(char)