下面土嘎嘎小编分享使用动态规划解决多重背包问题的 Python 代码示例:
〓〓python代码如下:〓〓
def knapsack_multiple(weights, values, capacities):
n = len(weights) # 物品数量
m = len(capacities) # 背包种类数量
dp = [[0] * (cap + 1) for _ in range(n + 1)] # 动态规划表
# 逐步计算填充动态规划表
for i in range(1, n + 1):
for j in range(1, cap + 1):
for k in range(min(j // weights[i-1], capacities[i-1]) + 1):
dp[i][j] = max(dp[i][j], dp[i-1][j-k*weights[i-1]] + k*values[i-1])
return dp[n][capacities[m-1]]
# 示例用法
weights = [1, 2, 3] # 物品重量列表
values = [6, 10, 12] # 物品价值列表
capacities = [3, 4, 5] # 不同背包容量列表
max_value = knapsack_multiple(weights, values, capacities)
print("背包能够装下的最大价值为:", max_value)
在这段代码中, knapsack_multiple 函数使用动态规划解决多重背包问题。它接受三个参数: weights 是物品的重量列表, values 是物品的价值列表, capacities 是背包的容量列表,表示不同种类的背包的容量。
函数使用一个二维动态规划表 dp 来记录每个位置对应的最大价值。通过三层循环,逐步填充动态规划表。外层循环遍历物品列表,中间循环遍历背包容量,内层循环遍历当前物品在该背包容量下可以选择的数量。对于每个物品和背包容量,根据不同的选择数量计算最大价值,并更新动态规划表。
最终,返回动态规划表中最后一个位置的值,即表示所有物品和背包种类下的最大总价值。
在示例中,输入的物品重量列表为 [1, 2, 3] ,价值列表为 [6, 10, 12] ,背包容量列表为 [3, 4, 5] 。经过计算,得到背包能够装下的最大总价值为 22。