zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    隔行扫描 和 逐行扫描
    CSS3--关于z-index不生效问题
    vue与其他框架对比
    跨域(转)
    vue 事件修饰符(阻止默认行为和事件冒泡)
    vue 3.0新特性
    bash leetcode
    数据库
    css排版
    盒模型
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2170297.html
Copyright © 2011-2022 走看看