【代码随想录】刷题Day42

news2024/11/28 23:30:20

1.01背包问题

问题介绍:有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

1.二维数组实现思想

1.dp[i][j]的含义:首先i为物品的序号;j为背包的大小;dp[i][j]为当前[0~i]的物品中,背包容量为j时,所能得到的最大价值。其实就是只有i个物品,j大小背包,所能装的局部最优解。那么也就是说dp数组的右下角就是最终最优解

2.局部最优解的得出,dp数组的条件由来:核心思路就是一句话当一个物品摆在我们面前,我们只有选择或者不选择,那么我们选择塞入背包就意味着不管是否要将其他东西被替换掉,我们最后背包的价值能否比之前的背包价值要多。那就是两个情况,当面对第i个物品时,我们有选择塞入或者不选择塞入的情况:不选择塞进去的最优解就是前i-1个物品,j大小背包对应的局部最优解dp[i-1][j];选择塞进去,那么能确定的是i一定在里面,那么自然当前的背包容量变小了,那么我们要得到的就是当背包变为减去i对应重量是对应的局部最优解,即value[i](i对应的价值)+dp[i-1][j-weight[i]](j背包容量减去i重量对应的最优解)。

3.初始化:首先我定义的二维数组有0物品的行和0背包容量的列,所以将这列和行都定义为0;此外我们能发现,其实除了对应的dp[0][j]和dp[i][0]需要被初始化,其他的结果都是由这两行不断计算其他的推出来的

//bagweight:背包大小
//weight:不同物品对应的大小
//value:不同物品对应的价值
int bag_problem(int& bagweight, vector<int>& weight, vector<int>& value)
{
	vector<vector<int>> dp(weight.size()+1, vector<int>(bagweight + 1, 0));
	for(int i = 1; i <= bagweight; i++)
	{
		for (int j = 1; j <= weight.size()-1; j++)
		{
			dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
		}
	}
	return dp[bagweight][weight.size() - 1];
}

2.一维数组实现思想

1.dp[j]的含义:背包容量为j时的最大价值

2.dp数组条件:i为遍历的物品。如果i不放进去,那dp[j]=dp[j],需要注意的是右边的dp[j]是上一轮循环的结果,表示上一次的最大值仍然适用;如果i放进去,dp[j]=dp[j-weight[i]]+value[i]。那么我们其实就是在这两者之间取较大值作为结果,那么其条件就是dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

3.循环的问题:我们先遍历物品再遍历背包,这样的含义其实就是再不断加入物件的过程之中不断更新当前每一个容量下背包的最优解。不过背包的遍历顺序我们希望它是倒叙的,为什么?因为我们想要得到当前的大背包的最优解一定会去判断小背包,那么都是在同一层的情况下,从大到小遍历意味着当前大背包的量比较的就是上一次的最优解(如2所说“右边的dp[j]是上一轮循环的结果”),如果从小到大,那小的背包更新为当前的循环,那么意味着大背包的比较值是建立在当前的小背包最优解,不符合我们想要的条件比较。

4.初始化:全部初始化为0

//bagweight:背包大小
//weight:不同物品对应的大小
//value:不同物品对应的价值
int bag_problem(int& bagweight, vector<int>& weight, vector<int>& value)
{
	vector<int> dp(bagweight + 1, 0);
	for (int i = 1; i <= weight.size() - 1; i++)
	{
		for (int j = bagweight; j >= weight[i]; j--)
		{
			dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
		}
	}
	return dp[bagweight];
}

2. 分割等和子集

416. 分割等和子集

其实就是01背包的应用。求sum/2的背包,装下的最大数是否相同,如果相同则返回true。

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int target = 0;
        for(auto e: nums)
            target+=e;
        if(target%2==1)
            return false;
        target/=2;
        vector<int>dp(20001,0);
        for(int i=0;i<nums.size();i++)
        {
            for(int j=target;j>=nums[i];j--)
                dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
        }
        if(dp[target]==target)
            return true;
        return false;
    }
};

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

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

相关文章

头羊部落亮相首届校园预制菜展,成为预制菜行业领头羊

由北京工商大学与北京市学校基建后勤管理事务中心共同主办的首届预制菜产业与智慧团餐高质量发展研讨会暨校园食材展&#xff08;以下简称大会&#xff09;于2023年5月26-27日在北京工商大学举办。 △首届预制菜产业与智慧团餐高质量发展研讨会在北京工商大学隆重举行 △预制菜…

【Python map()、filter() 和 reduce()】零基础也能轻松掌握的学习路线与参考资料

Python编程中常使用map()、filter()和reduce()函数来实现对数据集的操作&#xff0c;尤其是在处理数据时&#xff0c;这些函数非常有用。在本文中&#xff0c;将介绍这些函数的学习路线和优秀实践&#xff0c;并提供一些参考资料供读者参考。 一、Python map() 函数 Python中…

附录5-黑马头条案例

目录 1 效果 2 组件库vant 2.1 安装 2.2 配置 2.3 项目中的使用 2.3.1 引用 2.3.2 tabbar 底部切换 2.3.3 navbar 顶部标题 2.3.4 van-list 上拉触底更新 2.3.5 van-pull-refresh 下拉更新 2.3.6 v-cell 2.3.7 van-icon 2.3.8 自定义风格 3 保持滚…

做接口测试时遇到接口加密了该如何处理

对明文编码生成信息摘要&#xff0c;以防止被篡改。比如MD5使用的是Hash算法&#xff0c;无论多长的输入&#xff0c;MD5都会输出长度为128bits的一个串。 摘要算法不要秘钥&#xff0c;客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文。 对称加密 对称加…

C语言获取AIX单网卡的多IP地址

环境配置 在AIX上&#xff0c;可以使用smitty tcpip命令给单个网卡配置多个IP别名。操作步骤如下&#xff1a; 选择Further Configuration 选择Network Interfaces 选择 Network Interfaces Selection 选择 Configure Aliases 5.选择Add an IPV4 Network Alias 选择需要配…

Vue3:组合式写法入门

Vue3&#xff1a;组合式写法入门 Date: May 11, 2023 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> imp…

超声波都应用在哪些领域中?功率放大器如何放大超声波?

超声波是声波的一部分&#xff0c;它的频率高于20kHz&#xff0c;是无法被人耳听到的声波&#xff0c;超声波与声波有共通之处&#xff0c;即它们都是由物体振动所产生&#xff0c;只能在介质中进行传播。无论是在自然界&#xff0c;还是人们的日常生活之中&#xff0c;超声波都…

Power BI DAX函数

1、聚合函数——由表达式定义的列或表中所有行的&#xff08;标量&#xff09;值&#xff0c;例如计数、求和、平均值、最小值或最大值。 函数说明APPROXIMATEDISTINCTCOUNT在列中返回唯一值的估计计数AVERAGE返回列中所有数字的平均值&#xff08;算术平均值&#xff09;AVER…

基于 Python 和深度学习技术实现的人体姿态识别

人体姿态识别是计算机视觉领域的一个重要应用&#xff0c;它通过识别人体的关键点和关节位置&#xff0c;能够准确地判断人体的姿态和动作。这项技术可以应用在很多领域&#xff0c;比如运动训练、医疗康复、安保监控等&#xff0c;为人们的生活和工作带来了很大的便利和效益。…

Fiddler抓包工具之fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 Fiddler弱网测试流程&#xff1a; 一、限速操作…

redis学习记录

前言 1. 什么是Redis&#xff1f;它主要用来什么的&#xff1f; Redis&#xff0c;英文全称是 Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xf…

代码里乐观锁与悲观锁

乐观锁与悲观锁区别 synchronized与cas举例 cas算法自旋 乐观锁原理&#xff1a;cas算法自旋 1.cas算法 2.自旋 乐观锁工具类 Atomiclnteger原子类incrementAndGet方法源码解析

React Fiber架构

说到Fiber&#xff0c;不得不说说他的发展史&#xff1a; React15 架构 React16之前的版本比对更新虚拟DOM的过程是采用循环递归方式来实现的&#xff0c;这种比对方式有一个问题&#xff0c;就是一旦任务开始进行就无法中断&#xff0c;如果应用中数组数量庞大&#xff0c;主…

红黑树及插入过程详解

推荐可视化插入、删除节点的二叉树网站&#xff1a;Red/Black Tree Visualization (usfca.edu) 1. 概述 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff08;Binary Search Tree&#xff09;。它在普通二叉搜索树的基础上通过引入额外的颜色属…

DragGAN图像生成原理与实现

DragGAN图像生成原理与实现 DragGAN模型是什么呢1. DragGAN背景介绍2. 模型方法2.1 算法原理2.1.1 Motion Supervision2.1.2 点跟踪 3. 实现部署步骤3.1 安装PyTorch3.2 安装 DragGAN3.3 运行 DragGAN Demo3.4 功能介绍 项目地址&#xff1a;https://github.com/Zeqiang-Lai/Dr…

衡量有效的质量保证过程的10个基本指标

作者 | Tania Zhydkova 在开发的世界中&#xff0c;有一个永恒的规则&#xff0c;那就是你无法改进无法衡量的东西。当然&#xff0c;这条规则也适用于质量保证。 所生产软件的阵列呈指数级增长&#xff0c;这意味着保证质量所需的测试覆盖率也在以同样的程度增长。这也导致了…

浅谈Web渗透测试

目录 背景介绍 漏洞挖掘 渗透测试 个人看法 Web 渗透测试方法构想 PTES 简介 Web “PTES” 前期交互 信息收集 漏洞建模 漏洞分析 渗透利用 测试报告 Web渗透测试实例 前期交互 信息收集 漏洞建模 漏洞分析 渗透利用 报告 本文包括 背景介绍&#xff0c;We…

上传作品并投票的小程序微信中的微信投票微信小程序

现在来说&#xff0c;公司、企业、学校更多的想借助短视频推广自己。 通过微信投票小程序&#xff0c;网友们就可以通过手机拍视频上传视频参加活动&#xff0c;而短视频微信投票评选活动既可以给用户发挥的空间激发参与的热情&#xff0c;又可以让商家和企业实现推广的目的&am…

IDEA 创建 Springmvc 项目

一、概述 在18年的时候就开始接触 SpringBoot &#xff0c;然后就一直在使用它。众所周知 SpringBoot 内嵌 Tomcat&#xff0c;后续再也没有单独新建过Web 项目。作为IDEA 的用户&#xff0c;总想要用它来建一个Web 项目自己跑一跑&#xff0c;但建项目不是我最终目的~~ &…