acwing
A+B
1 | import java.io.*; |
1 | a,b=map(int,input().split()) |
map
函数,Python内置函数,映射函数
语法
1 | map(function,iterable) |
- 列表做参
1
2list(map(int,[2.34,13.14,66]))
[2,13,66] - 自定义函数做参
1
2
3
4def my(x):
return x+1
print(tuple(map(my,{2,3.6,6})))
# (3,4.6,7) - map函数返回的是一个
map
类型的序列,而不是列表1
2type(map(int,[3,4]))
<class 'map'> - 当function函数没有返回值的时候,返回一个由None组成的序列
1
2
3
4def my(number):
pass
print(list(map(my,[1,2,3])))
#[None,None,None]
01背包问题
假设你是个小偷,背着一个可以装4磅东西的背包。
可偷窃的商品入下:
为了让偷窃的商品价值最高就是01背包问题
枚举法在商品多到一定程度的时候肯定是行不通的,如何找到最优解呢?答案是使用动态规划
动态规划
对于背包问题,先解决小背包(子背包)问题,再逐步解决原来的问题。
吉他行
音响行
笔记本电脑行
公式
1 | import java.util.Scanner; |
1 | N,V=list(map(int,input().split())) |
python定义二维数组
使用numpy
1 | import numpy as np |
1 | arr=[[0]*3 for i in range(3)] |
完全背包问题
结合01背包问题图解我们得到了01背包问题的递推式子
完全背包问题就是物品数量无限,其实也可以强行01背包问题求解$cell[i][j]$
- $v[i]$表示物品体积
- $w[i]$表示物品价值
- 不选第i种物品:$cell[i-1][j]$
- 选1个第i种物品:$cell[i-1][j-v[i]]+w[i]$
- 选2个第i种物品:$cell[i-1][j-2v[i]]+2w[i]$
- 因为过程有限,过程不能无限下去,对于第i个物品,最多可以装$\frac{j}{v[i]}$个
- 所以递推式子其实就是
到这一步,已经能写出代码了,见python,只不过时间复杂度太大了,运行不通过
继续往下分析
等式两边同时加上$w[i]$
仔细看③与①相比就少了$cell[i-1][j]$,于是有了完全背包递推公式如下:
1 | N,V=list(map(int,input().split())) |
1 | for i in range(1,N+1): |
多重背包
如果$s[i]v[i]>V$,不就是一个完全背包
所以多重背包问题就是要转换成01背包+完全背包
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ofra Serendipity!
评论
TwikooWaline