30. 01背包问题 二维,01背包问题 一维,416.分割等和子集

背包问题分类: 

  • 1、确定dp数组以及下标的含义
  • 对于背包问题,有一种写法, 是使用二维数组,即dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少
  • 2、确定递推公式,可以有两个方向推出来dp[i][j]
  • 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)
  • 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值,此时 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
  •  3、dp数组如何初始化
  • 首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。此外,状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。
  • 4、确定遍历顺序
  • 先遍历物品还是先遍历背包重量呢?其实都可以!! 但是先遍历物品更好理解
  • 5、举例推导dp数组
#include <iostream>
#include <vector>using namespace std;int main(){int M, N; cin>>M>>N;vector<int> weight(M, 0);vector<int> value(M, 0);for(int i = 0; i < M; i++) cin>>weight[i];for(int i = 0; i < M; i++) cin>>value[i];// dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值vector<vector<int>> dp(M, vector<int>(N + 1, 0));// 初始化, 因为需要用到dp[i - 1]的值for(int j = weight[0]; j < N + 1; j++)dp[0][j] = value[0];for(int i = 1; i < M; i++){for(int j = 0; j < N + 1; j++){if(j < weight[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}cout << dp[M - 1][N]<<endl;return 0;
}

一维dp和二维dp的写法中,遍历背包的顺序是不一样的!二维dp遍历的时候,背包容量是从小到大,而一维dp遍历的时候,背包是从大到小。倒序遍历是为了保证物品i只被放入一次!。但如果一旦正序遍历了,那么物品0就会被重复加入多次!为什么二维dp数组遍历的时候不用倒序,因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖!

倒序遍历本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。

#include <iostream>
#include <vector>using namespace std;int main(){int M, N; cin >> M >> N;vector<int> weight(M, 0);vector<int> value(M, 0); //注意这里不是vector<int> value(N, 0); !!!!!!for(int i = 0; i < M; i++) cin >> weight[i];for(int i = 0; i < M; i++) cin >> value[i];vector<int> dp(N + 1, 0);for(int i = 0; i < M; i++){for(int j = N; j >= weight[i]; j--){ //注意这里是j--dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}}cout << dp[N] <<endl;return 0;
}

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for(int num : nums) sum += num;if(sum % 2 != 0) return false;int capacity  = sum / 2;vector<int> dp(capacity + 1, 0);for(int i = 0; i < nums.size(); i++){for(int j = capacity; j >= nums[i]; j--){// 每一个元素一定是不可重复放入,所以从大到小遍历dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);}}// 集合中的元素正好可以凑成总和capacityif(dp[capacity] == capacity) return true;else return false;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3226186.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

护佑未来!引领儿童安全新时代的AI大模型

引领儿童安全新时代的AI大模型 一. 前言1.1 AI在儿童安全方面的潜在作用1.2 实时监控与预警1.3 个性化安全教育与引导1.4 家长监护与安全意识提升 二. AI大模型的优势2.1. 保护儿童隐私和安全的重要性2.2. AI大模型如何应用于儿童安全领域2.1 儿童内容过滤2.2.1 儿童行为监测 2…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程&#xff0c;当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

简要描述C++ Memory Order

现代CPU基本都是多核CPU&#xff0c;基本都具备多线程能力。而涉及到多线程一定会涉及到多线程共享资源数据竞争的问题。如果对竞争资源不加以保护或者针对多线程访问的管理就会出现不同线程读取数据不一致或者更加严重的问题。C标准库提供了互斥锁&#xff08;std::mutex&…

利用外部知识增强的LEMMA模型:提升多模态虚假信息检测的LVLM方法

LEMMA: Towards LVLM-Enhanced Multimodal Misinformation Detection with External Knowledge Augmentation https://arxiv.org/abs/2402.11943https://arxiv.org/abs/2402.11943 1.概述 多模态虚假信息通过综合文字、图像和视频等多元化形式,在社交平台上的传播过程中,相…

BN的 作用

1、背景&#xff1a; 卷积神经网络的出现&#xff0c;网络参数量大大减低&#xff0c;使得几十层的深层网络成为可能。然而&#xff0c;在残差网络出现之前&#xff0c;网络的加深使得网络训练变得非常不稳定&#xff0c;甚至出现网络长时间不更新或者不收敛的情形&#xff0c;…

牛市中途深度调整,一览下半场值得关注的 Solana 生态五大潜力项目

近期有关加密货币的利空消息让市场行情一度陷入了恐慌之中&#xff0c;短期利空的落地也将伴随着接下来市场的蓄势。对于投资者来说&#xff0c;现在布局超跌潜力项目不失为一个不错的机会。作为本轮牛市值得关注的两大生态&#xff0c;Solana和TON的快速发展和吸金效应&#x…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板&#xff0c;适合做对外贸易的外贸公司搭建…

使用webrtc-streamer查看rtsp实时视频

1.下载webrtc-streamer 2.解压运行webrtc-streamer.exe 在浏览器访问127.0.0.1:8000&#xff0c;点击窗口可以看到本机上各窗口实时状态&#xff0c;点击摄像头可以显示摄像头画面。 5.安装phpstudy&#xff0c;并建立网站。&#xff08;具体过程自己网上搜&#xff09; 6.打开…

给你的博客加上评论区

一个网站如果有评论功能&#xff0c;可以更好的和读者互动。VuePress 也有很多评论插件&#xff0c;这里简单介绍下&#xff0c;最后介绍本站所使用的 Twikoo。 大部分评论插件都是使用的 Github 或 Gitee 的 issue 功能&#xff0c;也就是用 issue 去存储评论&#xff1b;而 …

自定义指令实现Element Plus分页组件内容样式修改

改之前是这样的 改之后是这样的 因为之前我也有写过文章讲解Vue2-ElementUI分页组件的样式修改。 ElementUI 分页组件内容样式修改https://blog.csdn.net/qq_54548545/article/details/139728064且通常情况下&#xff0c;一个项目若是大量使用到分页组件&#xff0c;咱们也不可…

Leetcode104.求二叉树的最大深度

题目描述 递归法 class Solution {public int maxDepth(TreeNode root) {if (root null) { //帮助下面的else语句判空return 0;} else {int leftHeight maxDepth(root.left);int rightHeight maxDepth(root.right);/*** 要注意的点* 1. 这个return是写在else语句里面的&am…

市场营销新手入门:推荐5本让你快速成长的好书!

我过去面试过数千人&#xff0c;发现了一个非常有趣也让人担忧的现象&#xff1a; 无论是资深还是资浅的市场营销人士&#xff0c;如果被问及什么是市场营销&#xff0c;什么是品牌&#xff0c;什么是整合营销传播&#xff0c;市场营销组合与整合营销传播有什么区别&#xff0…

汽车免拆诊断案例 | 奥迪 Q7 e-tron无法通过插电式充电器充电

故障现象 车主反映&#xff0c;车辆无法使用自带的插电式充电器充电。&#xff08;这种充电方法是“Mode 2充电”&#xff0c;3针插头&#xff0c;10 A&#xff0c;2.2 kW&#xff09; 接车后验证故障&#xff0c;将Type 2充电插头连接到车辆时&#xff0c;充电口锁定销循环三…

AD3518 SOP-8封装 单节锂电池保护芯片 可替代XB8608/XB8608A

AD3518 是一款内置 MOSFET 的单节锂电池保护芯片。该芯片具有非常低的功耗和非常低阻抗的内置 MOSFET。该芯片有充电过压&#xff0c;充电过流&#xff0c;放电过压&#xff0c;放电过流&#xff0c;过热&#xff0c;短路&#xff0c;电芯反接等各项保护等功能&#xff0c;确保…

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘&#xff08;dashboard&#xff09;后&#xff0c;可以通过修改看板属性中的SLUG等&#xff0c;生成url 举例&#xff1a; http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式&#xff1a;此处参考了官…

深入了解Rokid UXR2.0 SDK内置的Unity AR Glass开发组件

本文将了解到Rokid AR开发组件 一、RKCameraRig组件1.脚本属性说明2.如何使用 二、PointableUI组件1.脚本属性说明2.如何使用 三、PointableUICurve组件1.脚本属性说明2.如何使用 四、RKInput组件1.脚本属性说明2.如何使用 五、RKHand组件1.脚本属性说明2.如何使用3.如何禁用手…

产品经理和项目经理,有哪些区别和联系?

产品经理和项目经理在项目管理中扮演着不同的角色&#xff0c;它们之间既有区别又有联系。以下是对两者区别和联系的详细分析&#xff1a; 一、区别 1、工作职责 产品经理&#xff1a;主要负责产品的规划、设计、推广和运营&#xff0c;涵盖了整个产品生命周期的管理。他们需…

华为机试HJ106字符逆序

华为机试HJ106字符逆序 题目&#xff1a; 想法&#xff1a; 将输入的字符串倒叙输出即可 input_str input()print(input_str[::-1])

中小企业有必要使用ERP管理系统?

在激烈市场竞争中&#xff0c;企业共同追求的目的都是——降本增效。大型企业运用ERP系统精细化管理&#xff0c;但对成长中的中小企业&#xff0c;传统ERP投入高昂&#xff0c;难达降本增效之效。中小企业更需要适合其需求的解决方案&#xff0c;所以&#xff0c;相比如传统的…

亚马逊关键词优化全攻略:自养号测评让你的产品跃居首页

常常听到亚马逊运营吐槽&#xff1a; 为啥我的产品就是上不了首页呢&#xff1f; 我的关键词要怎么优化才能排名靠前啊&#xff1f; 的确&#xff0c;每天都有无数个卖家在想方设法让自己的产品排到首页&#xff0c;所以产品的竞争激烈程度不言而喻。 我们在亚马逊运营中&a…