Table of Contents
背包问题是典型的动态规划问题,不同类型的背包问题有不同的解题思路
01背包:N件物品,每件物品有一个
完全背包:N种物品,不限量
多重背包:N种物品,每种物品数量有限
要学会不同背包问题解题思路之间的转化。。。
题型一(01背包)
n个物品,重量为w,装入容量为C的容器,要求取若干个物品,使得装入重量最大(容器内剩余容量最小)
分析:属于背包型动态规划,相当于背包容量和背包中物品价值二者相等的一般背包问题(貌似也称为伪背包问题)。通过转化思想即求:在总体积为V的情况下,可以得到的最大价值(此时价值用物品的重量代替),最后再用总体积减去最大价值时所占空间就是剩下的最少空间。
def package1(V, n, w):
dp = [[0]*(V+1) for i in range(n+1)]
for i in range(1, n+1):
for j in range(1, V+1):
if j < w[i-1]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]]+w[i-1])
return V-dp[n][V]
if __name__ == '__main__':
"""coins, n = [1, 5, 10, 25], 10 # 输入可换的硬币种类,总金额n
coinChange2(coins, n)"""
V,n,w=24,6,[8,3,2,7,9,7]
d = package1(V,n,w)
print d
dp数组
[
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,