动态规划算法可视化

动态规划过程

算法代码

1vector<vector<int>> knapsack01(vector<int>& weights, vector<int>& values, int capacity) {
2 int n = weights.size();
3 // 创建DP表格
4 vector<vector<int>> dp(n + 1, vector<int>(capacity + 1, 0));
5
6 // 填充DP表格
7 for (int i = 1; i <= n; i++) {
8 for (int w = 0; w <= capacity; w++) {
9 if (weights[i-1] <= w) {
10 // 可以选择当前物品
11 dp[i][w] = max(
12 values[i-1] + dp[i-1][w-weights[i-1]],
13 dp[i-1][w]
14 );
15 } else {
16 // 无法选择当前物品
17 dp[i][w] = dp[i-1][w];
18 }
19 }
20 }
21
22 return dp;
23}

算法说明

0-1背包问题是一个经典的动态规划问题。给定一组物品,每个物品都有自己的重量和价值, 在限定的总重量内,选择物品使得物品的总价值最大。每个物品只能选择一次(要么选,要么不选)。 时间复杂度为O(nW),其中n是物品数量,W是背包容量。