请用不同方法完成0-1背包问题程序,并通过测试。 问题描述:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
时间: 2023-07-15 09:13:30 浏览: 51
方法一:动态规划
```python
def knapsack01_dp(N, V, c, w):
# 初始化dp数组
dp = [[0] * (V + 1) for _ in range(N + 1)]
# 动态转移
for i in range(1, N + 1):
for j in range(1, V + 1):
if j >= c[i - 1]:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - c[i - 1]] + w[i - 1])
else:
dp[i][j] = dp[i - 1][j]
return dp[N][V]
```
方法二:回溯法
```python
def knapsack01_bt(N, V, c, w):
def backtrack(i, cur_c, cur_w):
nonlocal max_w
# 达到叶子节点,更新最大价值
if i == N:
max_w = max(max_w, cur_w)
return
# 不选第i个物品
backtrack(i + 1, cur_c, cur_w)
# 选第i个物品
if cur_c + c[i] <= V:
backtrack(i + 1, cur_c + c[i], cur_w + w[i])
max_w = 0
backtrack(0, 0, 0)
return max_w
```
测试:
```python
N = 5
V = 10
c = [2, 2, 6, 5, 4]
w = [6, 3, 5, 4, 6]
print(knapsack01_dp(N, V, c, w)) # 输出:15
print(knapsack01_bt(N, V, c, w)) # 输出:15
```