golang实现动态规划算法(背包问题)

背包问题吐血详解-附带golang实现 在看 算法图解 【第九章动态规划 9.1 背包问题】 的时候,看图可以理解每一步结果,但是自己实现代码就是实现不了,通过阅读其他文章的解析,将自己的理解阐述下~ 问题描述: 假设你是个小偷,背着一个可装4磅东西的背包。 可选商品如下: 商品 价值 重量 音响 3000 4 笔记本电脑 2000 3 吉他 1500 1 遍历时,取出 max (当前商品价值+剩余重量价值 , 上一个商品当前重量价值) ,若当前商品价值更高,当前商品放入背包,若上一个商品价格更高,则取出当前商品 阅读详情

本文是学习完算法图解之后的总结以及代码实现,第一部分是问题引入,第二部分是动态规划工作原理简介,第三部分是基于golang的代码实现

问题引入

【以小偷到商店偷东西为例,假设小偷有个4磅容量的背包,商店里有吉他、音响、笔记本电脑三样商品,吉他一磅重,价值1500,音响4磅,价值3000,笔记本3磅价值2000,问怎么才能让此次偷盗价值最大化? 】

对于这个问题,很容易想到偷吉他和笔记本电脑价值最高为3500,如果再增加几个商品呢? 

我们先来看看只有三个商品的时候都有那些选择组合,如下图,组合里总容量大于4的不能装到背包里,在剩余的组合中选择最大价值的组合,所以是吉他和笔记本组合, 组合数是2^n,当商品数量增加时组合数呈指数增长,当商品很多时显然这个方法不合适,

那如何找到最优解呢? 就是我们接下来要介绍的动态规划

动态规划算法工作原理

动态规划的思想是先解决小问题,再逐步解决大问题,背包问题来说,就是先解决小背包的问题,再解决大背包的问题

每个动态规划都是从一个网格开始的,背包问题网格如下。

商品/

背包容量

1234
吉他    
音响    
笔记本    

网格的每行表示当前可偷的商品,第一行只能偷吉他,第二行能偷吉他和音响,第三行笔记本音响吉他。。。如还有商品以此类推,列表示当前背包的容量,我们把原本4磅的背包拆分成1-4磅的小背包,接下来我们逐行处理来看看。

吉他行:第一行第一列,吉他重量1,第一列表示背包的容量也是1,刚刚好可以放下,那第一个单元格的最大价值就是1500,

第二列两磅,也可以放下吉他,故最大价值也是1500,第三列3磅自然可以放下,且慢!笔记本也是3磅啊,记住!第一行只有吉他可以偷,我们要记住动态规划的思路是先从小问题逐步解决大问题,这很重要,所以第三个单元格最大价值只能是1500,第四个单元格也一样

商品/

背包容量

1234
吉他1500150015001500
音响    
笔记本    

接下来我们看第二行,音响行,这时候你可以偷的商品是吉他和音响了,这时候我们开始考虑,第一列能放下一个四磅重的音响吗? 答案是不能,我们知道这时候还有吉他可选,吉他是1磅的,故而这时最大价值只1500,那么第二、三列情况和第一列是一样的,来到第四列,这是一个四磅背包,那么音响能不能装进背包呢? 刚刚好音响是4磅重的。那应不应该放进背包呢? 当只有吉他的时候四磅重的背包最大价值是1500,音响的价值是3000,显然应该装进背包。

商品/

背包容量

1234
吉他1500150015001500
音响1500150015003000
笔记本    

来到第三行,我们可选的商品有吉他、音响、笔记本,我们来看第1列,笔记本3磅,无法放入1磅的背包中,观察这个表格,笔记本无法放入,只有音响和吉他可选择的时候,1磅背包的最大价值是多少呢? 我们只需要看上一行的可以了。第2列同第1列一样,第三列有不同了,其实对每个单元格,我们都在考虑几个问题,当前的背包能放的下吗?不能的话,当前能放进背包的最大价值是多少? 能的话,我该不该放进背包呢? 好的,我们就按这个思路来看下,当前3磅的背包能放下吗? 答案是能? 那我们应该放进去吗? 如果我们不放笔记本,那当前的最大价值是1500,而笔记本价值2000,显然应该放进背包,这时更新了背包的最大价值2000, 来看看最后一个单元格,4磅的背包能放的下笔记本,那我们该不该放进背包呢?,如果不放笔记本的话,当前的最大价值是3000,等等,放笔记本的话,不是还有1磅的空间吗? 我们还有可选择的子背包,1磅的背包最大价值是1500啊,这样背包的最大价值是3500了。

商品/

背包容量

1234
吉他1500150015001500
音响1500150015003000
笔记本1500150020003500

回顾整个填充网格的过程。可提炼公式如下

cell[n][m]= max  (上一个单元格的值[cell[n][m-1],   当前商品的价值+剩余空间的价值cell[n-1][m-当前商品的重量])

我们求解每个单元格的目的就是要合并两个子单元格来解决更大的问题。

代码实现

接下是用golang实现的动态规划算法。

package main

import "fmt"

const (
	// 行
	RAW int = 4
	// 列
	COL int = 5
)

// 物品的重量 舍弃数组的0位置元素
var weight = [RAW]int{0, 1, 4, 3}

// 物品的价值 舍弃数组的0位置元素
var value = [RAW]int{0, 1500, 3000, 2000}

// 动态规划网格
var cells [RAW][COL]int

// 用于回溯选择的商品 selected[i]=1 表示放进背包,0表示不放进背包
var selected [RAW]int

// 动态规划计算网格
func dynamic() {

	for i := 1; i < len(value); i++ {
		for j := 1; j < 5; j++ {
			cells[i][j] = maxValue(i, j)
		}
	}
	for i := 0; i < RAW; i++ {
		fmt.Printf("raw is %v \n", cells[i])
	}
	findBack()
	fmt.Printf("selected goods is %v \n", selected)
}

// 判断当前单元格最大价值方法
func maxValue(i, j int) int {
	// 当前商品无法放入背包,返回当前背包所能容纳的最大价值
	if j < weight[i] {
		return cells[i-1][j]
	}
	// 可放进背包时候,计算放入当前商品后的最大价值
	curr := value[i] + cells[i-1][j-weight[i]]
	// 与当前商品不放进背包的最大价值比较,看是否应该放进背包
	if curr >= cells[i-1][j] {
		return curr
	}
	return cells[i-1][j]
}

// 回溯选择的商品方法
func findBack() {
	col := COL - 1
	for i := RAW - 1; i > 0; i-- {
		if cells[i][col] > cells[i-1][col] {
			selected[i] = 1
			col = col - weight[i]
		} else {
			selected[i] = 0
		}
	}
}

运行结果如下:

raw is [0 0 0 0 0] 
raw is [0 1500 1500 1500 1500] 
raw is [0 1500 1500 1500 3000] 
raw is [0 1500 1500 2000 3500] 
selected goods is [0 1 0 1] 

看到这里,你是否想到,如果我们继续增加商品,比如增加一个重一磅,价值1500的小烤箱会怎么样? 我们来试试

在表格中新增烤箱列,来到第四行,这时候我们可选择的商品多了一个烤箱,第一个单元是可以放下烤箱的,

我们发现吉他和烤箱都是一磅,我们要不要放进背包呢? 其实二选一即可,后面的列按之前的规则填满即可,最大价值仍然是3500,这时我们知道了可选择商品可以是吉他和笔记本,也可以是烤箱和笔记本,但是我们的算法只能给出最优解中的一个。

商品/

背包容量

1234
吉他1500150015001500
音响1500150015003000
笔记本1500150020003500
烤箱150015002000

3500

********************************************************* 正文完 ********************************************************

本文是看完《算法图解》之后基于书上原理的代码实现,本来只想写代码实现算法,想了想把算法原理也整理了一遍,碍于能力有限,如文中有所欠缺,请阅读《算法图解》第九章。

多重背包问题大全(超详细) 题目: 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 首先多重背包问题可以转换为01背包来解决,关键就是如何转换! 我们先来一种最基本的解法。 朴素解法 基本思想:比如第i件物品有s个,我可以把相同种类的物品的进行合并,比如我拿出两件合并出一个新的物品,我拿出三件合并出一个新的物品,以此类推,我拿出s个合并出一个新的物品。基于这种思想,我们把第i件的s个物品转换为s种体积各不 阅读详情

相关推荐

go:实现动态规划之0-1背包问题算法(附完整源码)

go:实现动态规划之0-1背包问题算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 99

动态规划(背包问题-golang)

【0-1背包问题】 问题描述: 有n个物品和一个最多能承受重量为W WW的背包,其中第i ii件物品的重量是weight [ i ] ,所对应的价值为value[i],每一件物品只有一件(即只能放入背包一次),求解将哪些物品放入背包后得到的背包中物品的总价值最大? 递归分析 weight物品的重量,那么我们从0开始选择,就存在选或者不选的两种情况,在这两种情况之下,那么背包的重量也存在两种情况,可以装下或者无法装下,递归函数如下: // weight 物品的容量 // value 物品的价值 // in

qq_45061361的博客 405

go语言:实现Knapsack problem背包问题算法(附完整源码)

go语言:实现Knapsack problem背包问题算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 169

Golang实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

* 本文实现了0-1背包问题的多种算法,包括动态规划、贪心、回溯、分支定界算法。 * 动态规划算法时间复杂度较低,能够求解较大规模的问题,但空间复杂度较高,不适用于数据量较大的问题。 * 贪心算法时间复杂度较低,能够求解较大规模的问题,但不能保证求得的解是最优解。 * 回溯算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大的问题。 * 分支定界算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大的问题。

BXA 1791

go语言:实现knapsack背包问题算法(附完整源码)

go语言:实现knapsack背包问题算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 84

一文详解Stata重复测量方差分析的概念、原理、适用情形以及操作命令实现、对结果的解读、操作注意事项 附零基础小白友好入门Stata统计学/计量经济学学习路径

重复测量方差分析(Repeated Measures ANOVA)适用于同一受试者在不同时间点或条件下的多次测量数据,如疗效跟踪和跨条件对比研究。其核心特征包括:数据结构为每个受试者多个观测值,数据具有相关性(违反独立性假设),变异分解为个体间和个体内变异。关键假设包括正态性、方差齐性和球形性(通过Mauchly检验验证)。适用场景包括纵向研究和小样本追踪,但不适用于存在滞留效应或学习效应显著的数据。操作步骤涉及数据准备(宽/长格式转换)、正态性与球形性检验、主分析命令(单/多因素)及事后检验。

m0_72274883的博客 1565

动态规划---背包问题

0-1背包问题 最常见的0-1背包问题,改问题描述如下: 有一个课装载重量为W的背包和N个商品,每个物品都有重量和价值两个属性,其中第i个商品的重量为wt[i],价值为val[i],现在用这个背包装商品,问最多能装的价值是多少? 举个例子更直观吧: 高压锅重 4kg,价值300 风扇重 3kg,价值200 皮鞋重 1kg,价值150 背包总重4kg; 在面对一个动态规划时候,往往从以下几个方面分析,会有奇效: 本题中状态和选择是什么? 这个例子中的状态很显然有两个,一个就是背包的重量W,一个

xhuyang111的博客 1151

手把手教你用Simulink搭建BPSK调制解调系统(附完整参数设置与波形分析)

本文详细指导如何使用Simulink搭建BPSK调制解调系统,涵盖从理论到实践的全流程,包括参数设置、模块连接和波形分析。重点解析调制解调中的关键参数和常见问题,如带通滤波器设计、载波同步等,帮助读者快速掌握BPSK系统的实现与调试技巧。

weixin_27741699的博客 423

Golang实战:0-1背包问题四大算法性能对比与场景选择

本文深入探讨了Golang中解决0-1背包问题的四大算法:动态规划、贪心算法、回溯法和分支定界法。通过详细的代码实现和性能对比,分析了各算法在不同数据规模下的适用场景,帮助开发者根据实际需求选择最优解决方案。特别适合需要优化资源分配和组合选择的工程场景。

weixin_29250403的博客 365

DFT知识点扫盲——DFT scan chain

实际在项目中synccell一般直接上ULVT,既然是SDF,就是带Scan接口的DFF,SN (set negtive)是低置位,RP(reset positive)是高复位,既没有SN也没有RP的就是无复位寄存器。1:定义:满足可测试性设计(DFT),将设计中所有的触发器连接到一条或者若干条链上,称为scan chain,将一个复杂的时序电路转换为简单的组合电路进行测试,这一步是在逻辑综合(DC)中实现。当SE=1当SI=1时,电路进入scan状态,当SI=0时,电路工作在normal状态。

笨蛋大乌龟的博客 4936

SAP Joule for Consultants 与 Joule for Developers 全面解读

SAP推出面向不同用户群体的Joule AI助手:开发者版(Joule for Developers)专注于编码提效,嵌入开发工具链辅助生成、重构和测试代码;顾问版(Joule for Consultants)聚焦业务场景,集成SAP云应用知识库,为咨询项目提供方案设计、差距分析和实施指引。两者共享AI底座但功能侧重点不同:开发者版优化技术开发流程,顾问版加速项目交付周期。典型应用场景包括制造业云转型方案制定和ABAP代码迁移,分别展示了两版本在业务决策支持和技术实施中的价值。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 542

从旅行打包到代码优化:Golang中0-1背包问题的多算法性能对比实验

本文通过Golang实现对比了0-1背包问题的四种经典算法:动态规划、贪心算法、回溯法和分支定界。实验结果显示,动态规划适合中小规模精确解,贪心算法在大规模场景下效率最高但为近似解,回溯法仅适用于极小规模,分支定界在精确算法中扩展性最佳。文章为开发者提供了在不同场景下的算法选择策略和优化技巧。

weixin_29215391的博客 288

OpenCV-Python实战(10)——详解 OpenCV 轮廓检测

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,将首次通过简单示例了解轮廓的基本概念,然后通过实际示例来了解如何检测和压缩轮廓,最后利用介绍如何利用图像矩描述检测到的轮廓属性。

盼小辉丶的博客 3万+

GitHub_Trending/go2/Go:动态规划算法实现原理详解

动态规划(Dynamic Programming,DP)是算法设计中的核心思想之一,它通过将复杂问题分解为重叠子问题并存储中间结果来避免重复计算。在实际开发中,动态规划广泛应用于路径规划、资源分配、文本处理等场景。本文将深入解析GitHub_Trending/go2/Go项目中动态规划算法的实现原理,帮助读者掌握这一重要算法思想。 通过阅读本文,你将获得: - ✅ 动态规划的核心思想和基本原理...

gitblog_00753的博客 635

【AI 智能体】Windows 环境 Hermes Agent(爱马仕)安装详细过程

Windows 环境 Hermes Agent(爱马仕)安装详细过程

congge_study的博客 1829

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 377

01背包依赖算法go实现

01背包依赖算法go实现 func main() { for { var cap,total int _,err := fmt.Scanln(&cap,&total) if err != nil { break } cap = cap/10 var weight [60][3]int var value [60][3]int p := mak...

weixin_43644373的博客 269

【读论文】ASR大模型动态热词新方案

大型语言模型(LLMs)以其卓越的通用知识和推理能力重塑了 AI 领域,但它们在处理特定领域或用户的专有词汇(即“热词”)时,往往表现出“选择性失忆”。传统的 RAG 或 Prompting 方案在实时性和准确性上存在瓶颈。阿里的《Hotword Model for Large Models》论文提出了一种“神经插件”方案,它能够在不修改基座模型权重的前提下,动态、精准地将热词能力注入到生成过程中。本文将从架构设计、训练范式到推理逻辑,全方位拆解这一技术的内核,并探讨其在工业级应用中的价值。

kakaZhui的博客 292

每周一道算法题004:背包

问题: 假设你要去野营。你有一个容量为6磅的背包,需要决定该携带下面的哪些东西。其中每样东西都有相应的价值,价值越大意味着越重要: •水(重3磅,价值10); •书(重1磅,价值3); •食物(重2磅,价值9); •夹克(重2磅,价值5); •相机(重1磅,价值6)。请问携带哪些东西时价值最高? 思路: 这是一个典型的背包问题,求解此类问题,通常会使用动态规划法。不要被名字吓到...

baoli1912的博客 1108

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

01背包和完全背包

01背包和完全背包

Trojanhorses的博客 308

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go语言数据结构和算法(三十九)动态规划背包问题

背包问题是经典的优化问题,涉及在重量限制下选择价值最大的物品组合。文章介绍了问题定义、输入数据、算法选择(如动态规划和贪心算法)、实现步骤(包括测试和优化)以及典型应用场景(投资组合、资源分配、装箱等)。通过Go语言代码示例展示了动态规划解法,并扩展了实战应用:判断数组能否分成和相等的两个子集。最后邀请读者关注微信公众号获取更多内容。

不愿言弃-念何的博客 354

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法学习篇12——背包问题

我们定义一个二维数组dpdp[i][w]:表示对于前i个物品,在背包容量为w时,能获得的最大价值。我们的目标就是求出dp[N][W]的值。核心思想:动态规划通过填表的方式,记录了所有子问题的解,避免了暴力搜索带来的指数级复杂度。适用场景:0-1背包问题,每个物品最多选一次。变种问题:完全背包:每种物品可以选择无限次。解决方案是内层循环从小到大遍历容量w。多重背包:每种物品有数量限制。分组背包:物品被分为若干组,每组内的物品互斥。学习建议:理解状态定义和转移方程是重中之重。

a19884792066的博客 718

LeetCode背包问题

本文将介绍如何使用Golang语言实现LeetCode中的背包问题,背包问题是一个常见的算法问题,它的目标是在给定的一组物品中选择一些物品放入背包中,使得背包的总重量不超过背包的容量,同时让放入背包中的物品的总价值最大。

weixin_54567607的博客 370

代码随想录day42|背包问题基础|416. 分割等和子集|Golang

笔记

weixin_42161901的博客 425

算法学习篇11——动态规划与贪心算法

动态规划和贪心算法是解决优化问题的两种重要算法范式。本文将介绍这两种算法的基本概念、特点、适用场景,并通过Go语言实现的示例代码来展示它们的应用。

a19884792066的博客 470

【算法】动态规划算法详解与示例(python、go、java)

动态规划

jhgj56的博客 876
上一篇: golang实现快速排序算法
下一篇: springboot整合jedis
1990_super
博客等级 码龄15年 83粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值