首页 > 其他分享 >动态规划 01背包

动态规划 01背包

时间:2024-03-18 16:58:14浏览次数:16  
标签:01 int 件物品 背包 Maxn 物品 动态 dp

本题选自蓝桥杯 小明的背包1;

用dp[i][j]代表选到第i个物品,剩余空间为j的状态;
用w[i]存放第i件物品的重量;
v[i]存放第i件物品的价值;

对于一件物品我们有两种选择: 要 或 不要;
我们想要两者之见最优(即价值最大)的选法那么就要比较 选此物品前:背包剩余容量为j-w[i]的最大价值+第i件物品的价值v[i] 和 不选此物品价值:背包剩余为j的最大价值,我们取两者较大值作为选完此物品的最大价值。
即:dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j]);

具体代码如下:

include

include

using namespace std;

define Maxn 5000

int c[Maxn], w[Maxn];
int dp[Maxn];
int C;
// 输入
int n;
int main() {
cin >> n;
cin >> C;
for (int i = 0; i < n; i++) {
cin >> c[i] >> w[i];
}
int dp[Maxn];
memset(dp, 0, sizeof(dp)); //不装满
//创建动态规划数
for (int i = 0; i < n; i++) //遍历每一件物品
{
for (int j = C; j >= c[i]; j--)
//遍历背包容量,表示在上一层的基础上,容量为J时,第i件物品装或不装的最优解;
dp[j] = max(dp[j - c[i]] + w[i], dp[j]);
}
cout << dp[C] << endl;
}

我们不难发现如果从后往前推仅需一个数组即可即dp[j] j代表剩余空间;
先写一个for循环遍历每个物品;
若选择该物品:dp[j]=dp[j-w[i]]+v[i];
不选:dp[j]=dp[j];
我们当然要选两者之间最大值即dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
此时可以改写为:
for(int i=0;i<n;i++) //遍历每一件物品
for(int j=c[i];j<=C;j++)
//遍历背包容量,表示在上一层的基础上,容量为J时,第i件物品装或不装的最优解;
dp[j]=max(dp[j-c[i]]+w[i],dp[j]);

标签:01,int,件物品,背包,Maxn,物品,动态,dp
From: https://www.cnblogs.com/432341abc3434/p/18080605

相关文章

  • 动态修改manifest.json
    点击查看代码//h5开发环境consth5Dev={ baseUrl:'https://devh5.....'}//h5测试环境consth5Test={ baseUrl:'https://testh5.....'}//h5生产环境consth5Prod={ baseUrl:'https://prodh5.....'}//微信小程序开发环境constmpWeixinDev={......
  • openGauss数据动态脱敏
    openGauss数据动态脱敏常见脱敏路线结果集解析:不改写发给数据库的语句,需要提前获悉数据表结构,待数据库返回结果后再根据表结构判断集合内哪些数据需要脱敏,并逐条改写结果数据。语句改写:将包含敏感字段查询的语句改写,对于查询中涉及的敏感字段(表列)通过外层嵌套函数的方式改写......
  • luoguP3330 [ZJOI2011] 看电影--组合数学--高精度
    \(luoguP3330\)[ZJOI2011]看电影废了老命想题解$$luogu$$$$HZOI$$题意到了难得的假期,小白班上组织大家去看电影。但由于假期里看电影的人太多,很难做到让全班看上同一场电影。最后大家在一个偏僻的小胡同里找到了一家电影院,但这家电影院分配座位的方式很特殊,具体方式如......
  • Exchange 2016卸载重新安装或更换电脑安装首次登录报错
    1、报错代码如下X-OWA-ErrorMicrosoft.Exchange.Data.Storage.ObjectNotFoundException2、解决方法2.1登录安装Exchange服务器,打开ExchangeManagementShell输入以下命令Get-Mailbox 2.2显示数据库异常,输入以下命令查看数据库和重新连接数据库Get-MailboxD......
  • FineReport - [01] 概述
     Gartner报表平台全球市场唯一入选国产软件! 一、FineReport是什么?有什么用途?FineReport是一款企业级Web报表工具,由帆软自主研发,秉持零编码的理念,易学易用且功能强大。经过多年的发展,它已经成为了中国报表软件市场的领导品牌。FineReport的主要用途包括:报表制作:它支持......
  • 信息系统项目管理师013:数字生态(1信息化发展—1.4数字中国—1.4.4数字生态)
    文章目录1.4.4数字生态1.数据要素市场2.数字营商环境3.网络安全保护1.4.4数字生态  随着新一代信息技术创新和迭代速度的明显加快,其在提高社会生产力、优化资源配置等方面的作用日益凸显。营造良好数字生态,有利于充分激发数字技术的创新活力、要素潜能、发展空......
  • 讲解动态规划算法
    动态规划(DynamicProgramming,简称DP)是一种通过将问题分解为子问题来求解复杂问题的优化算法。它一般用于在有重叠子问题的情况下,通过存储已求解的子问题结果来避免重复计算,从而大大提高算法的效率。动态规划算法的基本思想是将原问题划分为多个子问题,先求解子问题,再由子问题的......
  • 动态规划基础知识点(包含文档)
    动态规划知识点我也不知道为啥要收fei,我普通上传,但是平台好像不能直接看,大家可以试看,因为该文档就两页,还没完善1.动态规划与贪心的区别(1)求解问题区别:贪心:顾名思义,就是尽量的贪心使得结果利益最大化,从局部最优推出全局最优,比如:桌子上有三张钞票,面额各不相同,你只能取两次,每......
  • [npm] npm打包/运行时,报:"95% emitting CompressionPlugin ERROR Error: error:030801
    1问题描述环境信息windows10node:v20.11.1>node--versionv20.11.1vue:2.6.12[dependencies]"vue":"2.6.12""vue-count-to":"1.0.13""vue-cropper":"0.5.5""vue-meta":&q......
  • P1377 [TJOI2011] 树的序 (笛卡尔树)
    笛卡尔树模板题题目给出一个生成序列要我们构造一个二叉搜索树。所以值要满足二叉搜索树的性质。因为给出的是生成序列,所以序列的下标是满足最小堆的性质。那么可以按照满足二叉搜索树的那一维度进行排序也就是值进行排序。然后进行构建即可。最后进行先序遍历即可获得答......