| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【算法/C语言】01背包问题(动态规划DP) -> 正文阅读 |
|
[数据结构与算法]【算法/C语言】01背包问题(动态规划DP) |
题目:国王和金矿问题有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维数组peopleNeed[]。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 功能:(1) 要求max_n、max_people、gold和ppeopleNeed均为可输入的; (2) 编写DP函数,求解答案F; (3) 编写main主函数,完成输入,调用DP函数和显示答案结果。 样例输入1:5 92 22 87 46 90 100 77 22 29 50 99 样例输出1:133 3 4 思路:max_n看做物品的数量n ; max_people看做背包容量c ; gold看做物品的价值v; peopleNeed看做物品的重量w?。 根据01背包问题求解即可。 伪码:Function knapsack(n, c, *w, *v) 输入:物品数量n,背包容量c,物品的重量*w,物品的价值*v 输出:放入背包的物品和背包中的最大价值
时间复杂度:O(nc) 具体:用二维数组创建一个表格,先给表格赋初值:j < w[ i ] 时,m[ i ][ j ] = 0 ;? w[ i ] < j < c 时,m[ i ][ j ] = v[ i ] 。 再由第 i 个物品的放或者不放重填表格:j < w[ i ] 时(不放),m[ i ][ j ] = m[ i - 1 ][ j ]?; 否则(放),取?m[ i - 1 ][ j ](不放)和?m[ i - 1 ][ j - w[ i ] ] + v[ i ](放)的最大值 ?m[ i ][ j ] = max( m[ i - 1 ][ j ], ( m[ i - 1 ][ j - w[ i ] ] + v[ i ] ) )?。 此时,背包的最大价值为 m[ n ][ c ] 。 接着求放了哪几个物品:
实现:?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 19:48:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |