动态规划求解0-1背包问题:

问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大。

动态规划核心:计算并存储小问题的最优解,并将这些最优解组合成大问题的最优解。(将原问题分解为若干子问题,然后自底向上,先求解最小的子问题,把结果存储在表格中,再求解大的子问题时,直接从表格中查询小的子问题的解,避免重复计算,从而让提高算法效率)

解决本问题思路:对于第 i 个物品,放入后可以取得最大的价值,那么,前 i-1 个物品在背包容量为 w-w[i] 的情况下能够取到最大的价值。(注:因为第 i 个物品可以放入,对应要占用背包 w[i] 的容量,所以 w-w[i] 的背包容量就是前 i-1 个物品所共有的总容量)

数据结构: value[i][j] 的值表示第 i 个物品放入背包大小为 j 的背包得最大价值。

递归式:

# -*- coding:utf-8 -*-
def main(): w = int(input()) #背包大小
n = int(input()) #物品个数 listWV = [[0,0]]
listTemp = [] for i in range(n):
listTemp = list(map(int, input().split())) #借助临时list每次新增物品对应的list加入到listWV中
listWV.append(listTemp) #依次输入每个物品的重量与价值 # 建立价值数组,初始值均为0,目的是为了在value[0][j]与value[i][0]的情况为0,毕竟不放入物品或者背包容量为0的情况下,背包中的价值肯定为0,
value = [[0 for i in range(w+1)] for j in range(n+1)] for i in range(1, n+1):
for j in range(1, w+1):
if j < listWV[i][0]: #若物品不能放到背包中
value[i][j] = value[i-1][j] #价值与之前相同
else: #物品可以放到背包中,最大价值在两者之中取
value[i][j] = max(value[i-1][j], value[i-1][j-listWV[i][0]]+listWV[i][1]) print(value[n][w]) if __name__ == '__main__':
main()

检测:

10
5
2 6
5 3
4 5
2 4
3 6 17

上述代码只打印了最大价值,若想要打印出分别是那几个物品装入,则:

# -*- coding:utf-8 -*-
def main(): w = int(input()) #背包大小
n = int(input()) #物品个数 listWV = [[0,0]]
listTemp = [] for i in range(n):
listTemp = list(map(int, input().split())) #借助临时list每次新增物品对应的list加入到listWV中
listWV.append(listTemp) #依次输入每个物品的重量与价值 # 建立价值数组,初始值均为0,目的是为了在value[0][j]与value[i][0]的情况为0,毕竟不放入物品或者背包容量为0的情况下,背包中的价值肯定为0,
value = [[0 for i in range(w+1)] for j in range(n+1)] for i in range(1, n+1):
for j in range(1, w+1):
if j < listWV[i][0]: #若物品不能放到背包中
value[i][j] = value[i-1][j] #价值与之前相同
else: #物品可以放到背包中,最大价值在两者之中取
value[i][j] = max(value[i-1][j], value[i-1][j-listWV[i][0]]+listWV[i][1]) print(value[n][w]) #打印放入的物品情况,需要遍历value数组
i = n
j = w
listInfo = [0 for i in range(n+1)]
while i>0:
if value[i][j] > value[i-1][j]: #若在背包容量相同的情况下,后一个物品对应的背包价值大于了前一个物品对应的背包价值,那么说明第i个物品一定放入了背包
listInfo[i] = 1
j = j - listWV[i][0]
i -= 1 listFlag = []
for i in range(len(listInfo)):
if listInfo[i] == 1:
listFlag.append(i) print(listFlag) if __name__ == '__main__':
main()

检测:

10
5
2 6
5 3
4 5
2 4
3 6 17
[1, 3, 5]

0-1背包问题——动态规划求解【Python】的更多相关文章

  1. 01背包问题(动态规划)python实现

    01背包问题(动态规划)python实现 在01背包问题中,在选择是否要把一个物品加到背包中.必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比較,这样的方式形成的问题导致了很多重叠子问题, ...

  2. C++动态规划求解0-1背包问题

    问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...

  3. Java实现动态规划法求解0/1背包问题

    摘要: 使用动态规划法求解0/1背包问题. 难度: 初级 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进 ...

  4. 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列

    0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...

  5. 蓝桥杯 0/1背包问题 (java)

      今天第一次接触了0/1背包问题,总结一下,方便以后修改.不对的地方还请大家不啬赐教! 上一个蓝桥杯的例题: 数据规模和约定 代码: import java.util.Scanner; public ...

  6. 背包问题(Knapsack problem)采用动态规划求解

    问题说明: 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示:0李子4KGNT$45001苹果5KGNT$57002橘子2 ...

  7. hdu2602Bone Collector ——动态规划(0/1背包问题)

    Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collec ...

  8. Python动态规划求解最长递增子序列(LIS)

    原始代码错误,移步博客查看O(N^2)及优化的O(N*logN)的实现:每天一道编程题--最长递增子序列

  9. c语言数据结构:01背包问题-------动态规划

    两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...

随机推荐

  1. idea 报错javax/xml/bind/DatatypeConverter

    idea 报错javax/xml/bind/DatatypeConverter   java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeCon ...

  2. zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间

    zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 之前的博文 使用zabbix3..4的ICMP Ping模版实现对客户端网络状态的监控 https://www.cnblog ...

  3. 青葱的岁月 Mybatis JdbcType与Oracle、MySql数据类型对应列表

    Mybatis JdbcType Oracle MySql JdbcType ARRAY     JdbcType BIGINT   BIGINT JdbcType BINARY     JdbcTy ...

  4. PAT 甲级 1144 The Missing Number (20 分)(简单,最后一个测试点没过由于开的数组没必要大于N)

    1144 The Missing Number (20 分)   Given N integers, you are supposed to find the smallest positive in ...

  5. delphi 多线程定时执行程序如何写

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  6. Swift 4.0 Xib实现Button调整

    1.Xib画的界面按钮,代码中进行调整按钮图片在上,文字在下: 代码中修改按钮的位置比较好: payButton.titleEdgeInsets = UIEdgeInsetsMake((payButt ...

  7. JS的正则表达式限定开始和结尾等测试

    []:匹配该区间内人任意一个字符^:匹配以某内容开头的$:匹配以模拟内容结尾的字符\w:测试是英文字母,数字,下划线.{}:设置区间,可出现几次到几次该文学习和测试几个正则的方法,测试结果如图,不加多 ...

  8. iOS-UITableView的性能优化10个小技巧

    通常你会发现一个图片类的app会在一个imageView上做下面这些事情: 1  下载图片(主要的内容图片+用户头像图片)2  更新时间戳3  展示评论4  计算动态的cell的高度 Tip#1 学习 ...

  9. python:如何传递一个列表参数

  10. jenkins集成robot用例并发送自定义报告

    slave