0-1背包问题:动态规划 python 空间优化

本文介绍了0-1背包问题的基本概念,通过动态规划解决此类问题,并详细阐述了如何使用一维数据进行空间优化,降低算法的空间复杂度。提供了一维和二维空间解决方案的Python代码示例。
摘要由CSDN通过智能技术生成

0-1背包问题总述

0-1背包问题是最简单的问题,此外还要完全背包问题、多重背包问题、混合背包问题、二维费用背包问题、分组背包问题等等。好的参考资料可以见《背包问题九讲》:https://www.kancloud.cn/kancloud/pack/70124

其中0-1背包问题是最基本的问题,其问题描述如下:

给出n个珍珠的体积v[i]和其价值price[i],将他们装入一个大小为C的背包,最多能装入的总价值有多大?

之所以叫0-1背包,就是因为n个物品,每个只有一件,只有装包/不装包两种状态,即0-1问题。

解决该问题的方法为动态规划(Dynamic Programming),动态规划单听这个词觉得很庞大,其实可以说是对递归的一种优化,递归是不管需不需要都进行重新计算,其计算复杂度极高,动态规划用数据来存储其之前的状态,当进行下一步计算的时候直接调用不需要重新计算。那么问题来了,动态规划需要确定两个点:状态、状态转移方式。这里可以参考很多资料,不再仔细叙述。

状态转移方式:dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] +price[i]); 

最后计算出结果后,还要把哪些东西放入背包可以打印出来,这个利用倒循化进行遍历,如果后一个物品放

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值