给定 n 个不同物品和一个背包,物品 i 的重量是 wi,价值为 vi,背包容量为 C,物品 i 只有两种选择:装入背包或不装入背包(0/1背包问题,0/1 knapsack problem)。如何选择装入背包的物品,使得装入背包中物品的总价值最大?
时间: 2023-12-02 09:21:14 浏览: 67
动态规划解决0-1背包问题-0-1 knapsack problem.zip
这个问题可以使用动态规划算法来解决。
定义一个二维数组 dp[i][j] 表示前 i 个物品装入容量为 j 的背包中所能获得的最大价值。
状态转移方程为:
- 如果第 i 个物品不放入背包中,则 dp[i][j] = dp[i-1][j]
- 如果第 i 个物品放入背包中,则 dp[i][j] = dp[i-1][j-wi] + vi
取这两种情况的最大值,即 dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi)。
初始化 dp[0][j] 和 dp[i][0] 都为 0,表示背包容量为 0 或没有物品可选时,所能获得的最大价值都为 0。
最终的最大价值为 dp[n][C]。
时间复杂度为 O(nC)。
代码实现如下:
int knapsack(int n, int C, int w[], int v[]) {
int dp[n+1][C+1];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= C; j++) {
if (j >= w[i]) {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]);
} else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n][C];
}
阅读全文