AcWing 网站的题库,除了测试用的「A + B 问题」排在序号上的第一题,最先收录的就是背包问题。站长亲自讲解著名的「背包九讲」的视频题解,是学习背包问题不可错过的优质资源,其 DP 分析法也独树一帜。建议至少掌握「0 - 1背包问题」和「完全背包问题」本文不作多余讲解,只提供风格与本文一致的参考代码。

    • 0 - 1 背包
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 1004;
    4. int v[N], w[N];
    5. int dp[N];
    6. int n, m;
    7. int main() {
    8. cin >> n >> m;
    9. for (int i=0; i<n; ++i) {
    10. cin >> v[i] >> w[i];
    11. }
    12. for (int i=0; i<n; ++i) {
    13. for (int j=m; j>=v[i]; --j) {
    14. dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
    15. }
    16. }
    17. cout << dp[m] << endl;
    18. return 0;
    19. }
    • 完全背包
    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 1004;
    4. int v[N], w[N];
    5. int dp[N];
    6. int n, m;
    7. int main() {
    8. cin >> n >> m;
    9. for (int i=0; i<n; ++i) {
    10. cin >> v[i] >> w[i];
    11. }
    12. for (int i=0; i<n; ++i) {
    13. for (int j=v[i]; j<=m; ++j){
    14. dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
    15. }
    16. }
    17. cout << dp[m] << endl;
    18. return 0;
    19. }