| |
|
开发:
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背包问题及优化一维数组版 |
一.题目描述?假设有4个物品体积分别为2,5,3,2,价值分别为30,20 ,40,20 假设你是小偷,背着1个容量为7的包来偷东西,那你肯定要在背包容量允许的情况下,偷到价值高的东西 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.二维数组用 f [ i ] [ j ] 来表示第i件物品在体积为j时的最大价值,v [ i ] 表示第i件物体体积,w [ i ] 表示第i件物体价值 图表示第i件物品在体积为j时,拿或不拿的最大价值,横为 j,纵为 i
(1)背包容量不够时,放得下的前i个物品的最大价值为前 i -1 个物品的最大价值,即 ? ? ? ? f [ i ] [ j ] = f [ i - 1 ] [ j ] ? ?(2)??背包容量够时,有2种选择 ? ? ? ? ? 选:f [ i ] [ j ] = f [ i? - 1 ] [ j?-?v [ i ] ]?+?w [ i ] 。 代码
2.一维数组
从二维表可以看出这能得出任意 i?与 j 合法时的最大价值f [ i ] [ j ] ?,但题目只需要求 f [ n ] [ m ],因此我们可以用一维数组来做。 这里我用 f [ j ] 来表示 n 件物品在容量 j 时能取得的最大价值 这时有 f [ j ]?= max( f [ j ] , f [ j?- v [ i ] ] + w [ i ] ) 这里要注意:优化版的内侧循环必须是逆序的 为什么要逆序4个物品体积分别为2,5,3,2,价值分别为30,20 ,40,20 我们拿第一行做例子 j = 2时,f [ 2 ] = max ( f [ 2 ] ,f [ 2 - 2 ] +30 ; j = 4?时, f [ 4 ] = max ( f [ 4 ] ,f [? 4 - 2 ] +30; 这时 f [ 2 ] 我们使用的是刚刚更新的 f [ 2 ] ,也就是 f [ 1?] [ 2 ] ,?而不是上一层的 f [ 0?] [ 2 ] 了 (结合前面的二维数组,手动模拟一下就能懂了) 也就是说,更新点时,右边的需要左边的,左边的不需要右边的,我们从右向左更新,可以保证左边的点不被破坏(之前我一直不理解,一位好大哥给我一语点破) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 接下来,上代码
谢谢大家的观看,千山万水总是情,三连再走行不行 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 13:30:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |