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

  • 相关阅读:
    mysql显示乱码
    aws常用命令
    Hive分析窗口函数(一) SUM,AVG,MIN,MAX
    Hive函数介绍
    Apache Drill 调研学习
    公有云与私有云对比分析报告
    python3 使用libvirt 相关安装
    libvirt虚拟库
    Reveal CocoaPods的使用
    AFNetworking 2.0 使用
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2170297.html
Copyright © 2011-2022 走看看