| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 动态规划-01背包问题通俗详解 -> 正文阅读 |
|
[数据结构与算法]动态规划-01背包问题通俗详解 |
如题所示:01背包问题
一个旅行者有一个最多能装?MM?公斤的背包,现在有?nn?件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,...,Cn,求旅行者能获得最大总价值。 【输入】 第一行:两个整数,MM(背包容量,M<=200M<=200)和NN(物品数量,N<=30N<=30); 第2..N+12..N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。 【输出】 仅一行,一个数,表示最大总价值。 核心思路:定义vs为背包容量,n为物品数量 定义数组w[i]表示第i个物品的重量(费用) 定义数组v[i]表示第i个物品的价值 定义数组dp[i][j]表示前i个物品的在不超过重量j的情况下的最大价值 如下:
那么首先dp[0][1~j]都初始化为0
这个知道吧,前0个物品不论背包能装多少价值都为0,这是初始状态,为后面也有用
直接上代码,我也不叨叨那些状态转移方程,把这些代码吃透了就行了 给一个例子 假如说 输入背包容量为10,有3个物品 第一个物品 重量6? ?价值5 第二个物品 重量8? ?价值2 第三个物品?重量2? 价值4 在初始化dp[0][1~j]为0后,进入上行代码 w[1]=第一个物品重量=6 在j>=6时 dp[1][j-w[1]]都等于物品1的价值 这里dp[i-1][j]就上上文的初始化起了作用,为0嘛,能够比较 因为装进去了就要从背包里扣除他的重量 在j<=6时,第一个物品装不进去,所以前1个物品装入背包的价值等于前i-1个物品的价值,因为你什么也没装,之前装在里面的还保持着它的价值,重量,这里前i-1为0,说明背包空了 第二个循环? w[2]=第二个物品重量=8 在j>=8时 比较是否装进去 这里第一个物品的价值大于第二个物品的价值,严谨的说前i-1个物品的价值大于第i个物品装进去后的价值 j<=8时 和上文一样,背包保持原样,装不进去 第三个循环 同上 最终答案锁定在dp[n][vs]上为9 这里要说明初始化可有可无 完整代码如下:
相对于暴力穷举,动态规划的优点在于能够利用数组记忆之前已计算出的子最优解,避免了重复计算,提高了效率,此题还有优化空间的方法,请参阅其他资料 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:54:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |