Update 背包问题理论基础多重背包.md

This commit is contained in:
jianghongcheng
2023-06-05 07:46:22 -05:00
committed by GitHub
parent de7879f26e
commit bdedd2df0f

View File

@ -194,55 +194,127 @@ public void testMultiPack2(){
Python Python
改变物品数量为01背包格式无参版
```python ```python
def test_multi_pack1(): def test_multi_pack():
'''版本一改变物品数量为01背包格式'''
weight = [1, 3, 4] weight = [1, 3, 4]
value = [15, 20, 30] value = [15, 20, 30]
nums = [2, 3, 2] nums = [2, 3, 2]
bag_weight = 10 bagWeight = 10
# 将数量大于1的物品展开
for i in range(len(nums)): for i in range(len(nums)):
# 将物品展开数量为1
while nums[i] > 1: while nums[i] > 1:
weight.append(weight[i]) weight.append(weight[i])
value.append(value[i]) value.append(value[i])
nums[i] -= 1 nums[i] -= 1
dp = [0]*(bag_weight + 1) dp = [0] * (bagWeight + 1)
# 遍历物品 for i in range(len(weight)): # 遍历物品
for i in range(len(weight)): for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量
# 遍历背包
for j in range(bag_weight, weight[i] - 1, -1):
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
for j in range(bagWeight + 1):
print(" ".join(map(str, dp))) print(dp[j], end=" ")
print()
def test_multi_pack2(): print(dp[bagWeight])
'''版本:改变遍历个数'''
weight = [1, 3, 4]
value = [15, 20, 30]
nums = [2, 3, 2]
bag_weight = 10
dp = [0]*(bag_weight + 1)
for i in range(len(weight)):
for j in range(bag_weight, weight[i] - 1, -1):
# 以上是01背包加上遍历个数
for k in range(1, nums[i] + 1):
if j - k*weight[i] >= 0:
dp[j] = max(dp[j], dp[j - k*weight[i]] + k*value[i])
print(" ".join(map(str, dp)))
if __name__ == '__main__': test_multi_pack()
test_multi_pack1()
test_multi_pack2()
``` ```
改变遍历个数(无参版)
```python
def test_multi_pack():
weight = [1, 3, 4]
value = [15, 20, 30]
nums = [2, 3, 2]
bagWeight = 10
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量
# 以上为01背包然后加一个遍历个数
for k in range(1, nums[i] + 1): # 遍历个数
if j - k * weight[i] >= 0:
dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i])
# 打印一下dp数组
for j in range(bagWeight + 1):
print(dp[j], end=" ")
print()
print(dp[bagWeight])
test_multi_pack()
```
改变物品数量为01背包格式有参版
```python
def test_multi_pack(weight, value, nums, bagWeight):
# 将数量大于1的物品展开
for i in range(len(nums)):
while nums[i] > 1:
weight.append(weight[i])
value.append(value[i])
nums[i] -= 1
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
for j in range(bagWeight + 1):
print(dp[j], end=" ")
print()
print(dp[bagWeight])
if __name__ == "__main__":
weight = [1, 3, 4]
value = [15, 20, 30]
nums = [2, 3, 2]
bagWeight = 10
test_multi_pack(weight, value, nums, bagWeight)
```
改变遍历个数(有参版)
```python
def test_multi_pack(weight, value, nums, bagWeight):
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量
# 以上为01背包然后加一个遍历个数
for k in range(1, nums[i] + 1): # 遍历个数
if j - k * weight[i] >= 0:
dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i])
# 使用 join 函数打印 dp 数组
print(' '.join(str(dp[j]) for j in range(bagWeight + 1)))
print(dp[bagWeight])
if __name__ == "__main__":
weight = [1, 3, 4]
value = [15, 20, 30]
nums = [2, 3, 2]
bagWeight = 10
test_multi_pack(weight, value, nums, bagWeight)
```
Go Go
```go ```go