Hello大家好我是小亦,今天我们来讲Acwing题解的第二篇:01背包问题,适合新手来练练手,话不多说思路给大家qwq:
现在呢让我们详细探讨0-1背包问题的解题思路吧~。这个问题是一个经典的动态规划问题,其目标是在不超过背包容量的情况下,选择物品以最大化背包中物品的总价值。
问题定义
输入:物品数量N,背包容积V,每件物品的体积v[i]和价值w[i]。
输出:在不超过背包容量的情况下,能够装入背包的物品的最大总价值。
动态规划思路
状态定义:
定义dp[i][j]表示考虑前i件物品,当背包容量为j时的最大价值。
状态转移方程:
对于每件物品,我们有两种选择:放入背包或不放入背包。
如果我们不放入第i件物品,那么dp[i][j] = dp[i-1][j]。
如果我们放入第i件物品,那么我们需要检查背包容量是否足够,即j >= v[i]。如果足够,dp[i][j] = dp[i-1][j-v[i]] + w[i]。
综合两种情况,状态转移方程为:dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] + w[i]),其中j >= v[i]。
初始化:
初始化dp[0][j] = 0,因为没有物品时,无论背包容量是多少,价值都是0。
初始化dp[i][0] = 0,因为背包容量为0时,无论有多少物品,价值都是0。
计算顺序:
按照物品的顺序(从1到N)和背包容量的顺序(从1到V)进行计算。
最终结果:
最终结果存储在dp[N][V]中,表示考虑所有物品,背包容量为V时的最大价值。
代码实现
使用一个二维数组(列表的列表)来存储dp[i][j]的值。
遍历每件物品,对于每件物品,遍历所有可能的背包容量,根据状态转移方程更新dp数组。
最后,dp[N][V]即为所求的最大价值。
优化考虑
空间优化:由于dp[i][j]只依赖于dp[i-1][j]和dp[i-1][j-v[i]],因此可以只使用一个一维数组来存储状态,从而将空间复杂度从O(NV)降低到O(V)。
通过这种方法,我们可以有效地解决0-1背包问题,找到在给定背包容量下能够装入背包的物品的最大总价值。这种方法的时间复杂度为O(NV),空间复杂度为O(NV),对于较大的N和V,可以考虑进一步优化以提高效率,这也就能求出这道题的最思路了~,好那么好代码给大家吧qwq
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, V;
cin >> N >> V;
vector<int> v(N), w(N);
for (int i = 0; i < N; i++) {
cin >> v[i] >> w[i];
}
vector<vector<int>> dp(N+1, vector<int>(V+1, 0));
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= V; j++) {
if (j < v[i-1]) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i-1]] + w[i-1]);
}
}
}
cout << dp[N][V] << endl;
return 0;
}
下面为python写法qwq
def knapsack(N, V, weights, values):
# 初始化dp数组,所有值设为0
dp = [[0 for _ in range(V + 1)] for _ in range(N + 1)]
# 填充dp数组
for i in range(1, N + 1):
for w in range(1, V + 1):
# 如果当前物品的体积大于当前背包容量,不包括当前物品
if weights[i - 1] > w:
dp[i][w] = dp[i - 1][w]
else:
# 选择当前物品和不选择当前物品的最大价值
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
# 返回背包容量为V时的最大价值
return dp[N][V]
# 输入处理
N, V = map(int, input().split())
weights = []
values = []
for _ in range(N):
v, w = map(int, input().split())
weights.append(v)
values.append(w)
# 计算并输出最大价值
max_value = knapsack(N, V, weights, values)
print(max_value)
下期见~~~~