导读:本篇文章首席CTO笔记来给大家介绍有关背包最多装多少物品python的相关内容,希望对大家有所帮助,一起来看看吧。
Python贪婪算法之Python算法题实战 -《完美的代价》
最近也没什么事可做,就在备赛蓝桥杯(Python).蓝桥杯主要考察的是算法题目.所以我也在网上找了些资源刷题,昨天当我刷到《完美的代价》这道题目的时候,我就被卡住了.怎么想也想不通,就连解题代码也看不懂.更 搞笑 的是,昨天晚上我睡觉的时候,就在思考这道题目,结果不到一分钟,我就入睡了...
今天起床后,我就在CSDN里面找寻思路,有些博主提到,《完美的代价》需要用到贪心算法,但是我也没正经学过相关的算法,所以就去研究了一下贪心算法,发现这个算法还有点意思呢
贪心算法并不是一个具体的算法,而是一种算法的思想,或者说是解决问题的一种思路
要想弄明白贪心算法,可以从这两个关键点入手:
贪心算法最大的特点,就是在每一步中取最优化的解,不会回溯处理。这样的策略,自然在执行速度上更快,但是因为这种方法的短视。会导致得的解并不是真正的全局最优解,但是贪心算法得到的依然是一个近似最优解
问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高
通俗解释:假如你有一个只能承重100的背包,你往里面装一些重量和价值不等的东西,怎样才可以让你的背包中的价值最大
这个问题中就是关键在于,每个转入背包的东西,只能是被装入背包和不被装入背包两种状态,可以用0-1表示。所以叫0-1背包问题。其二,就是这个问题的两个限定。第一,背包的边界是明确,它只能承重那么多东西。第二,东西的边界是明确的,你只有那么一些东西可以选择
故而,这个问题其实有三种策略可以选择:
这三种策略中,策略一看起来最好的策略
但是,策略一的模糊化太大,需要根据特殊的情况,做出特殊的改变
策略二和策略三相同,本身上并没有太多不同。只是二者的视角不同
我们了解贪心算法后,再来看看这道算法题吧
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
第一行是一个整数N,表示接下来的字符串的长度(N
求一个背包问题的解决方案.
。设第j 件物品的价格为v[j],重要度为w[j],共选中了k 件物品,编号依次为j1...jk,则所求的总和为:v[j1]*w[j1]+..+v[jk]*w[jk]请你帮助金明设计一个满足要求的购物单.
输入格式 输入的第1 行,为两个正整数,用一个空格隔开:
N m
请教我用python的贪心法做0/1背包问题
动态规划,可以给你说下思路。
我们用一个二维的矩阵A来存储中间结果,A[i][j]代表前i个物体装入容量为j的背包时可以得到的最优解,相当于是原问题的一个子问题,然后我们就可以写出递推式来更新这个矩阵,具体可以参考下详细的讲解,网上的博客非常多不用我再写一遍。
比如这种:
先自己读一遍吧,有问题可以再问。
想问下大神python的背包问题的源代码(最好玩也有伪代码,请用递归法实现),因为只学过递归法,所
递归有层数限制,所以最好不要用,能不用就不用,没有想到什么好的算法,弄了个简单粗暴的,包容量除以最小质量的,就是最多可以装多少个,然后全排列一遍三种商品,并计算价值,取最大的一个价值,代码如下:
a, b, c = 2, 2.5, 3 # 三种商品质量
A, B, C = 4, 5, 6 # 三种商品价值
m = 100 # 包容量
ds = int(100 / min(a, b, c)) # 最小质量 取到最大数量
mx = 0 # 最大价值
nl = [] # 商品数量列表
for i1 in range(0, ds + 1): # 全排列
for i2 in range(0, ds + 1 - i1):
for i3 in range(0, ds + 1 - i1 - i2):
# 判断总质量 超出则舍弃
n = i1 * a + i2 * b + i3 * c
if n m:
continue
# 计算总价值 取最高值及排列并存储
j = i1 * A + i2 * B + i3 * C
if mx j:
mx = j
nl = [i1, i2, i3]
# 输出最大价值和组合
print(mx)
print(nl)
背包物品的数量有限制的吗?
叠在一起的没有限制,不同的最多能放200个,注意背包中右上角的数量。希望可以被采纳,如果有疑问,可以追问。
背包问题(完全背包)
1.矩阵链乘法
2.投资组合问题
3.完全背包问题
4.01背包问题
5.最长公共子序列
一个背包,可以放入n种物品,物品j的重量和价值分别为 ,如果背包的最大重量限制是b,怎么样选择放入背包的物品以使得背包的总价值最大?
组合优化问题,设 表示装入背包的第j个物品的数量,解可以表示为 。那么目标函数和约束条件是:
如果组合优化问题的目标函数和约束条件都是线性函数,称为线性规划。如果线性规划问题的变量 都是非负整数,则称为整数规划问题。背包问题就是整数规划问题。限制所有的 时称为0-1背包
子问题的界定(就是靠什么来划分子问题):由参数k和y界定
k:考虑对物品1,2,3,...,k的选择。
y:表示背包总重
子问题计算顺序:k=1,2,...,k,对给定的k,y=1,2,...,b
:装前k个物品,重量不超过y时的背包最大值。
包含两种情况:不装第k种物品或至少装一件第k种物品。
对 的解释:装一件第k种物品后,最优的解法仍然是在前k个物品进行选择,仍有可能再选入1件第k种物品。
对边界条件:
:即只用第一种物品背包重量限制为y的最大价值,为了保证背包不超重,第一种物品至多能装 个,因为背包价值为
有些 那么通过设置为负无穷,在选择过程中抛弃掉为负的情况。
标记函数:用来追踪解
按照递推公式:以k=2为例子,简单演算如下:
依次类推,可得备忘录表:
标记函数的备忘录:
物品受限背包 :第i种物品最多用 个
0-1背包问题 :
多背包 :m个背包,背包 装入最大重量 在满足所有背包重量约束下使物品价值最大。
二维背包 :每件物品重量 和体积 ,背包总重不超过b,体积不超过V,使得物品价值最大。
此问题是完全背包问题,即 一个物品可重复出现。
结语:以上就是首席CTO笔记为大家介绍的关于背包最多装多少物品python的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。
以上内容为新媒号(sinv.com.cn)为大家提供!新媒号,坚持更新大家所需的互联网后端知识。希望您喜欢!
版权申明:新媒号所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 k2#88.com(替换@) 举报,一经查实,本站将立刻删除。