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:
|
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
|
||||||
|
Reference in New Issue
Block a user