mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Update 背包问题理论基础多重背包.md
This commit is contained in:
@ -194,55 +194,127 @@ public void testMultiPack2(){
|
||||
|
||||
Python:
|
||||
|
||||
改变物品数量为01背包格式(无参版)
|
||||
```python
|
||||
def test_multi_pack1():
|
||||
'''版本一:改变物品数量为01背包格式'''
|
||||
def test_multi_pack():
|
||||
weight = [1, 3, 4]
|
||||
value = [15, 20, 30]
|
||||
nums = [2, 3, 2]
|
||||
bag_weight = 10
|
||||
bagWeight = 10
|
||||
|
||||
# 将数量大于1的物品展开
|
||||
for i in range(len(nums)):
|
||||
# 将物品展开数量为1
|
||||
while nums[i] > 1:
|
||||
weight.append(weight[i])
|
||||
value.append(value[i])
|
||||
nums[i] -= 1
|
||||
|
||||
dp = [0]*(bag_weight + 1)
|
||||
# 遍历物品
|
||||
for i in range(len(weight)):
|
||||
# 遍历背包
|
||||
for j in range(bag_weight, weight[i] - 1, -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])
|
||||
|
||||
print(" ".join(map(str, dp)))
|
||||
for j in range(bagWeight + 1):
|
||||
print(dp[j], end=" ")
|
||||
print()
|
||||
|
||||
def test_multi_pack2():
|
||||
'''版本:改变遍历个数'''
|
||||
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)))
|
||||
print(dp[bagWeight])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_multi_pack1()
|
||||
test_multi_pack2()
|
||||
test_multi_pack()
|
||||
|
||||
```
|
||||
|
||||
|
||||
改变遍历个数(无参版)
|
||||
```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
|
||||
|
Reference in New Issue
Block a user