写一份动态规划解决部分背包问题的代码
时间: 2023-07-07 08:28:21 浏览: 81
好的,以下是动态规划解决部分背包问题的代码,具体注释请查看代码中的注释:
```python
# 物品数量
n = 4
# 背包容量
W = 8
# 每个物品的重量
wt = [2, 3, 4, 5]
# 每个物品的价值
val = [3, 4, 5, 6]
# 初始化动态规划表
dp = [[0] * (W + 1) for _ in range(n)]
# 填充动态规划表
for i in range(n):
for j in range(1, W + 1):
# 当前物品的重量大于背包容量,不能放入背包
if wt[i] > j:
dp[i][j] = dp[i - 1][j]
else:
# 取当前物品和不取当前物品中价值更大的一种情况
dp[i][j] = max(dp[i - 1][j], dp[i][j - wt[i]] + val[i])
# 打印动态规划表
for i in range(n):
for j in range(W + 1):
print(dp[i][j], end='\t')
print()
# 输出最终结果
print("最大价值为:", dp[n - 1][W])
```
注意:这份代码是解决“部分背包问题”的,即每个物品可以选择放入一部分,而不一定完全放入。如果要解决“0/1背包问题”,只需要将第13行修改为 `if wt[i] <= j:` 即可。
相关问题
写一份动态规划解决部分背包问题的c++代码
好的,以下是动态规划解决部分背包问题的 C++ 代码,具体注释请查看代码中的注释:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 物品数量和背包容量
int n, W;
cin >> n >> W;
// 每个物品的重量和价值
vector<int> wt(n), val(n);
for (int i = 0; i < n; i++) {
cin >> wt[i] >> val[i];
}
// 初始化动态规划表
vector<int> dp(W + 1);
// 填充动态规划表
for (int i = 0; i < n; i++) {
for (int j = W; j >= wt[i]; j--) {
// 取当前物品和不取当前物品中价值更大的一种情况
dp[j] = max(dp[j], dp[j - wt[i]] + val[i]);
}
}
// 输出最终结果
cout << dp[W] << endl;
return 0;
}
```
注意:这份代码是解决“部分背包问题”的,即每个物品可以选择放入一部分,而不一定完全放入。如果要解决“0/1背包问题”,只需要将第11行修改为 `vector<int> dp(W + 1, 0);`,第14行修改为 `for (int j = W; j >= wt[i]; j--)` 即可。
写一份动态规划法解决部分背包问题的完整代码
好的,以下是完整的动态规划法解决部分背包问题的代码,包括输入数据和输出结果:
```python
# 读入物品数量和背包容量
n, W = map(int, input().split())
# 读入每个物品的重量和价值
wt, val = [], []
for i in range(n):
w, v = map(int, input().split())
wt.append(w)
val.append(v)
# 初始化动态规划表
dp = [0] * (W + 1)
# 填充动态规划表
for i in range(n):
for j in range(W, wt[i] - 1, -1):
# 取当前物品和不取当前物品中价值更大的一种情况
dp[j] = max(dp[j], dp[j - wt[i]] + val[i])
# 输出最终结果
print(dp[W])
```
注意:这份代码是解决“部分背包问题”的,即每个物品可以选择放入一部分,而不一定完全放入。如果要解决“0/1背包问题”,只需要将第14行修改为 `for j in range(W, wt[i] - 1, -1):` 即可。
阅读全文