Python算法题解:动态规划解0-1背包问题

简介: Python算法题解:动态规划解0-1背包问题
+关注继续查看

概述

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。

定义

我们有 n 种物品,物品 j 的重量为wj,价格为pj。
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。

如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。

如果限定物品j最多只能选择bj个,则问题称为有界背包问题。

如果不限定每种物品的数量,则问题称为无界背包问题。

动态规划

动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。

通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。

思路

举例,令物品数量N=5,背包所能承受的最大重量为W=10,物品与价格的对应关系如下表左三列所示。

screenshot

当放入物品a时,在背包所能承受的重量内,计算背包拥有的物品总价格,并进行标记,如表格第一行所示,当背包所能承受的重量大于等于2时,都可以放入物品a,背包拥有的物品总价格为6。

接着我们放入物品b,放入之前,一是要判断背包是否所能承受其重量,二是判断放入之后与放入之前拥有的物品总价格哪个最大,如表格第二行所示,当背包所能承受的重量大于等于2时,都可以放入物品b,但是,物品b在背包容量为[2,3]的时候,放入之后的总价格3不如放入之前的总价格6大,所以不放入。

当背包所能承受的重量等于4时,放入物品b后,背包所能承受的重量4减去物品b的重量2后,剩余的所能承受的重量2还可以放入物品a,此时背包拥有的物品总价格为物品a和物品b的总价格之和,即为9,大于放入之前的物品总价格6,所以此时背包拥有的物品总价格最大为9。

分析可知,在一层循环遍历下,我们需要一个一维数组保存背包所能承受的最大重量与其拥有的物品总价格,并不断更新。

代码

Copy/0-1背包问题@paramN物品数量@paramW背包容量@paramweight物品重量@paramvalue物品价格@return最大价值/privatestaticinttraceBack(intN,intW,int[]weight,int[]value){int[]dp=newint[W+1];//范围[0,W]当前背包容量对应的物品总价值for(inti=0;i=weight[i];j--){//只要背包可以放入就放dp[j]=Math.max(dp[j-weight[i]]+value[i],dp[j]);//比较放入物品之前与放入之后的价值哪个大}}returndp[W];}
复杂度

显而易见,算法需要的时间复杂度为O(nW),空间的消耗(即所需的一维数组)为O(W)。

有不清楚的地方,伙伴们可以留言,更多的Python相关教程也会继续为大家更新!

相关文章
|
9天前
|
算法 搜索推荐 Shell
python技术面试题(十五)--算法
python技术面试题(十五)--算法
|
25天前
|
机器学习/深度学习 算法 TensorFlow
基于Python+DenseNet121算法模型实现一个图像分类识别系统案例
基于Python+DenseNet121算法模型实现一个图像分类识别系统案例
22 2
基于Python+DenseNet121算法模型实现一个图像分类识别系统案例
|
28天前
|
机器学习/深度学习 算法 Python
[python]最小传输时延(dijkstra算法)
简要介绍最小传输时延python解法和相关题目。
|
1月前
|
算法 数据挖掘 API
Sentieon|应用教程:利用Sentieon Python API引擎为自研算法加速
Sentieon|应用教程:利用Sentieon Python API引擎为自研算法加速
29 0
|
1月前
|
算法 数据挖掘 API
Sentieon|应用教程:利用Sentieon Python API引擎为自研算法加速
Sentieon|应用教程:利用Sentieon Python API引擎为自研算法加速
35 0
Sentieon|应用教程:利用Sentieon Python API引擎为自研算法加速
|
1月前
|
算法 数据可视化 数据库
Apriori关联算法讲解以及利用Python实现算法软件设计
Apriori关联算法讲解以及利用Python实现算法软件设计
44 1
Apriori关联算法讲解以及利用Python实现算法软件设计
|
1月前
|
算法 数据可视化 数据库
python粗糙集简约算法+可视化界面
python粗糙集简约算法+可视化界面
40 0
|
1月前
|
机器学习/深度学习 存储 算法
最邻近规则分类 KNN (K-Nearest Neighbor)算法及python实现
最邻近规则分类 KNN (K-Nearest Neighbor)算法及python实现
|
1月前
|
算法 Python
Python OJ题典型算法:字符型数据与ASCII码详解
本文介绍了字符型数据与ASCII码的相关知识,包括ASCII码的基本概念和原理,以及如何将字符转换为对应的ASCII码。同时,还提供了示例代码和解题技巧,帮助读者更好地理解和运用这些知识。
43 0
|
2月前
|
算法 Python
Python OJ题典型算法:最长公共子序列
本文介绍了动态规划算法在解决最长公共子序列问题中的应用。通过详细的解题思路和代码实现,展示了如何利用动态规划算法高效地求解最长公共子序列的长度。这些技巧和方法对于理解和掌握动态规划算法以及解决其他类似问题具有重要意义。
40 0
相关产品
机器翻译
推荐文章
更多