背包问题

"learning……"

Posted by Ryan on January 8, 2025

因为生活,没有如果

01背包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N, W;
    cin >> N >> W;

    vector<int> weights(N), values(N);
    for (int i = 0; i < N; ++i) {
        cin >> weights[i] >> values[i];
    }

    // dp[i][j] 表示前 i 个物品在容量为 j 时的最大价值
    vector<vector<int>> dp(N + 1, vector<int>(W + 1, 0));

    for (int i = 1; i <= N; ++i) {
        for (int j = 0; j <= W; ++j) {
            if (j < weights[i - 1])
            {
                dp[i][j] = dp[i - 1][j]; // 不选第 i 个物品
            }
            else
            {
                dp[i][j] = max(dp[i - 1][j],                  // 不选
                               dp[i - 1][j - weights[i - 1]] + values[i - 1]); // 选
            }
        }
    }

    cout << dp[N][W] << endl;  // 输出最大价值
    return 0;
}

完全背包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N, W;
    cin >> N >> W;

    vector<int> weights(N), values(N);
    for (int i = 0; i < N; ++i) {
        cin >> weights[i] >> values[i];
    }

    // dp[i][j] 表示前 i 个物品在容量为 j 时的最大价值
    vector<vector<int>> dp(N + 1, vector<int>(W + 1, 0));

    for (int i = 1; i <= N; ++i) {
        for (int j = 0; j <= W; ++j) {
            if (j < weights[i - 1])
            {
                dp[i][j] = dp[i - 1][j]; // 不选第 i 个物品
            }
            else
            {
                dp[i][j] = max(dp[i - 1][j],                  // 不选
                               dp[i][j - weights[i - 1]] + values[i - 1]); // 选
            }
        }
    }

    cout << dp[N][W] << endl;  // 输出最大价值
    return 0;
}