动态规划入门-01背包问题

news2024/12/28 18:43:50

动态规划入门-01背包问题

问题描述

01背包1

假设你有个最大载重量为 300 k g 300kg 300kg的背包,有4个物品。它们的重量分别为 123 k g , 88 k g , 93 k g , 100 k g 123kg,88kg,93kg,100kg 123kg,88kg,93kg,100kg,价值分别为$$10,$19,$8,$20$。

请问背包内最大可以放入多少价值的物品?


问题求解

这个问题被称为01背包问题,是典型的动态规划例题。

确定状态
确定选择
定义dp数组
确定边界条件
寻找状态转移
求解答案

这里的价值是我们要优化的目标值,物品数目和重量为两个状态,所以依据这两个状态可以定义二维dp数组。

对于每个物品,我们有两种选择,即放入背包或者不放入背包。

我们设数组f[n][w]代表前n个物品在w容量的背包里可以放入的最大价值。

当没有物品或者背包容量为0时,价值显然是0:
f [ 0 ] [ w ] = f [ n ] [ 0 ] = 0 f[0][w] = f[n][0] = 0 f[0][w]=f[n][0]=0
我们求解的是背包内的物品价值最大化,则状态转移为:
f [ i ] [ j ] = { f [ i − 1 ] [ j ] , w [ i ] > j m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − w [ i ] ] + v [ i ] ) , w [ i ] ≤ j f[i][j] = \begin{cases} f[i-1][j] &, w[i]>j \\ max(f[i-1][j],f[i-1][j-w[i]] + v[i]) &, w[i] \leq j \end{cases} f[i][j]={f[i1][j]max(f[i1][j],f[i1][jw[i]]+v[i]),w[i]>j,w[i]j


代码实现

Java

public class mian {
	static int maxVal(int[] w,int[] v,int maxw) {
		int n = w.length;
		int[][] f = new int[n][maxw+1];
		for (int i = 1; i < n; i++) {
			for (int j = 1; j <= maxw; j++) {
				if (j < w[i]) {
					f[i][j] = f[i-1][j];
				} else {
					f[i][j] = Math.max(f[i-1][j-w[i]] + v[i],f[i-1][j]);
				}
			}
		}
		return f[n-1][maxw];
	}
	public static void main(String[] args) {
		int[] w = {123, 88, 93, 100};
		int[] v = {10, 19, 8, 20};
		int maxw = 300;
		System.out.println(maxVal(w,v,maxw)); // 47
	}
}

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

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

相关文章

第二证券|ChatGPT被“玩坏”,美图大涨45%,AIGC赛道风口来了?

AIGC&#xff08;人工智能主动生成内容&#xff09;近期被ChatGPT带火了&#xff01; 近来明星人工智能公司OpenAI发布了全新的谈天机器人模型ChatGPT。该模型能够主动生成代码以及绘画、答复一系列问题、承认自己的错误、质疑不正确的假设&#xff0c;乃至回绝不合理的要求&a…

Caspase-1活性分析:艾美捷FAM-FLICA试剂盒解决方案

艾美捷FAM-FLICA Caspase-1 (YVAD) Assay Kit FAM-FLICA Caspase-1 活性分析试剂盒检测方案&#xff1a; 1、凋亡诱导&#xff1a; 在开始实验之前&#xff0c;确定可重复的方法用于通过触发胱天蛋白酶活性获得阳性对照。此过程随每个细胞系而显著变化。例如&#xff0c;细胞…

JUC并发编程第九篇,原子操作类分类解析,LongAdder为什么这么快原理分析?

JUC并发编程第九篇&#xff0c;原子操作类分类解析&#xff0c;LongAdder为什么这么快原理分析&#xff1f;一、基本类型原子类二、数组类型原子类三、引用类型原子类四、对象的属性修改原子类五、原子操作增强类六、原理分析&#xff0c;LongAdder 为什么这么快&#xff1f;位…

JS获取音频的总时长,解决Audio元素duration为NaN || Infinity 问题

当我们在加载一个线上mp3地址或者获取audio的duration的时候&#xff0c;会发现有拿到duration是Infinity的情况&#xff0c;这时如果我们动态的展示录音时间时候就会有问题。首先明确一下这是chrome浏览器自己的存在的一个bug&#xff0c;因为我们拿到的录音数据流没有定义长度…

商务与经济统计 | 推断统计

一.概率 事件 若干样本点的集合 事件的概率 等于事件中所有的样本点概率之和 条件概率 贝叶斯定理 二.离散型概率分布 随机变量 是一次试验的结果的数值性描述 离散型随机变量 指的是有穷个数值或一系列无穷的数值的随机变量 连续型随机变量 代表某一区间或多个区间…

通配符的应用

我们使用通配符描述切入点&#xff0c;主要的目的就是简化之前的配置&#xff0c;具体都有哪些通配符可以使用? *:单个独立的任意符号&#xff0c;可以独立出现&#xff0c;也可以作为前缀或者后缀的匹配符出现 execution&#xff08;public * com.itheima.*.UserService.find…

webpack基础配置教程

文章目录1.初识Webpack2.开启项目3.处理js和json文件webpack小试牛刀webpack打包js/json文件webpack默认不能处理css4.webpack配置文件1.初识Webpack 什么是webpack? Webpack是一个模块打包器&#xff08;意思同构建工具&#xff0c;所谓构建︰将程序员写完的【源代码】&#…

Sentinel服务熔断功能

Sentinel服务熔断功能 sentinel整合ribbonopenFeignfallback 1、环境搭建&#xff08;新建模块&#xff09; 1.1、启动nacos和sentinel 1.2、新建服务提供者cloudalibaba-provider-payment9003/9004模块 1、引入pom.xml文件 <?xml version"1.0" encoding&quo…

21.前端笔记-CSS-字体图标

1、字体图标产生 使用场景&#xff1a;用于显示网页中通用的小图标iconfont 为什么不用精灵图&#xff1a; &#xff08;1&#xff09;图片文件还是比较大的 &#xff08;2&#xff09;图片本身放大或缩小会失真 &#xff08;3&#xff09;一旦图片制作完毕想要更换&#xf…

ThingsBoard 3.1.1版本在window本地运行之设备直连(二)

目录 前言 1、Thingsboard 框架 2、MQTT设置 1.MQTT概念 2.MQTT在TB里担任的角色 3.MQTT配置 3、结果 前言 ThingsBoard是一个物联网管理平台&#xff0c;这个平台可以让其他企业入驻进来&#xff0c;这些入驻的企业或者个人就是租户&#xff08;tenant&#xff09;&#…

入门系列 - Git工作流程

Git工作流程 Git的工作流程一般如下&#xff1a; 克隆 Git 资源作为工作目录。在克隆的资源上添加或修改文件。如果其他人修改了&#xff0c;你可以更新资源。在提交前查看修改。提交修改。在修改完成后&#xff0c;如果发现错误&#xff0c;可以撤回提交并再次修改并提交。 …

【C++】vector

vector与string许多功能相似&#xff0c;有了string的基础学起来很轻松 文章目录一、vector的介绍二、vector的使用1、vector定义&#xff08;构造&#xff09;类2、vector与string相似的接口3、vector迭代器失效问题三、vector的模拟实现一、vector的介绍 vector文档&#xf…

第十四届蓝桥杯集训——JavaC组第七篇——逻辑运算符

第十四届蓝桥杯集训——JavaC组第七篇——逻辑运算符 目录 第十四届蓝桥杯集训——JavaC组第七篇——逻辑运算符 逻辑运算符 逻辑与 逻辑或 非 逻辑运算法优先级 练习题&#xff1a; 逻辑运算符 &&逻辑与‖逻辑或!逻辑非逻辑运算与位运算不同&#xff0c;逻辑运…

脚本语言Bash简明教程【1】

Bash(GNU Bourne-Again Shell)is a Unix shell and script language written by Brian Fox for the GNU Project as a free software replacement for the Bourne shell. First released in 1989, it has been used as the default login shell for most Linux distributions…

React - Context 使用(共享对于一个组件树而言是 “全局” 的数据)

React - Context 使用&#xff08;共享对于一个组件树而言是 “全局” 的数据&#xff09;一. Context 概念理解二. Context 使用三. Context 组件传值实例Context官网&#xff1a; https://zh-hans.reactjs.org/docs/context.html 一. Context 概念理解 Context 提供了一个无…

Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案

一. 缓存雪崩 1. 含义 同一时刻&#xff0c;大量的缓存同时过期失效。 2. 产生原因和后果 (1). 原因&#xff1a;由于开发人员经验不足或失误&#xff0c;大量热点缓存设置了统一的过期时间。 (2). 产生后果&#xff1a;恰逢秒杀高峰&#xff0c;缓存过期&#xff0c;瞬间海…

核心竞争力决定未来,中国社会科学院与美国杜兰大学金融管理硕士项目为你助力

随着社会发展的日新月异&#xff0c;知识更新迭代更是以秒来计算&#xff0c;我们不得不为自身有限的技能和认知而焦虑。面对新的机遇最好的应对方法就是要有学习能力&#xff0c;永远学习&#xff0c;终身学习&#xff0c;这是别人永远都抢不走的竞争力。身在金融领域的你&…

关于flex布局和九宫格布局的实现

1.父容器常见属性 display&#xff1a;flex (项目在主轴上的排列方式) justify-content&#xff1a;flex-start / flex-end / center / space-around / space-between &#xff08;项目在交叉轴上的排列方式&#xff09; align-items: flex-start / flex-end / center / ba…

类实现接口,并且对象转型引用,接口引用实现类,抽象类实现接口且被子类继承返回抽象类的值给接口对象转型父类引用子类

类实现接口&#xff0c;并且对象转型引用 目录接口&#xff1a;最最特殊的抽象类。声明行为当多个类有共同的属性和方法用抽象类当符合什么是什么&#xff1f;用继承&#xff1b;继承抽行类当描述能干嘛&#xff1f;用接口接口的方法都是抽象方法的声明接口和抽象类的区别以人的…

集成springSecurity遇到的跨域问题

引言 该项目主要使用技术&#xff1a;sprinboot、springSecurity、vue,其它的技术就不介绍了 其中springSecurity是我参考网上的案例去进行的集成&#xff0c;虽然集成成功了&#xff0c;但是还不是太懂。 下面就开始介绍一下我遇到的问题 问题重现 由于我项目后端集成了s…