top1编程
← 返回题目
题解

01背包问题

1 条题解

  • 0
    @ 2026-7-28 22:45:00
    #include<bits/stdc++.h>
    using namespace std;
    
    int w[101], v[101];    // 存储物品信息:w[i]表示第i件物品的重量,v[i]表示第i件物品的价值
    int dp[22001];         // 动态规划数组:dp[j]表示背包容量为j时能获得的最大价值
    
    int main() {
        int t, m;          // t:背包总容量(M), m:物品数量(N)
            cin >> t >> m;     // 输入背包容量和物品数量
                
                    // 循环读取每件物品的重量和价值
                        for (int i = 1; i <= m; i++) {
                                cin >> w[i] >> v[i];  // 输入第i件物品的重量w[i]和价值v[i]
                                    }
                                        
                                            // 动态规划求解01背包问题
                                                for (int i = 1; i <= m; i++) {           // 遍历每件物品
                                                        // 逆序遍历背包容量(从大到小更新,避免重复放入)
                                                                for (int j = t; j >= w[i]; j--) {    // j从背包总容量t递减到当前物品重量w[i]
                                                                            // 状态转移:比较放入当前物品和不放当前物品的价值
                                                                                        // 1. 放入:dp[j-w[i]](剩余空间的最大价值) + v[i](当前物品价值)
                                                                                                    // 2. 不放入:保持原来的dp[j]
                                                                                                                dp[j] = max(dp[j - w[i]] + v[i], dp[j]);
                                                                                                                        }
                                                                                                                            }
                                                                                                                                
                                                                                                                                    // 输出背包容量为t时的最大价值
                                                                                                                                        cout << dp[t];
                                                                                                                                            return 0;
                                                                                                                                            }
    
    • 1