2 条题解

  • 0
    @ 2024-10-15 17:00:01

    单独的混合背包问题,三重循环题解:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, C;
        cin >> n >> C;
        
        vector<int> w(n), v(n), k(n);  // 物品的重量、价值、数量限制
        for (int i = 0; i < n; ++i) {
            cin >> w[i] >> v[i] >> k[i];
        }
        
        vector<int> dp(C + 1, 0);  // dp数组,表示容量为j时的最大价值
        
        // 遍历每个物品
        for (int i = 0; i < n; ++i) {
            // 遍历背包容量,从大到小,确保每个物品只能选择有限次
            for (int j = C; j >= 0; --j) {
                // 遍历物品的选择次数
                for (int x = 1; x <= k[i] && j >= x * w[i]; ++x) {
                    dp[j] = max(dp[j], dp[j - x * w[i]] + x * v[i]);
                }
            }
        }
        
        // 输出最终结果
        cout << dp[C] << endl;
        
        return 0;
    }
    
    
    
    • 0
      @ 2024-10-14 14:32:13

      单独的混合背包问题,不是这题题解:

      #include <iostream>
      #include <vector>
      using namespace std;
      
      int main() {
          int n, C;  // n 为物品数量,C 为背包容量
          cin >> n >> C;
          vector<int> w(n), v(n), k(n);
      
          // 输入每个物品的重量、价值和数量限制
          for (int i = 0; i < n; ++i) {
              cin >> w[i] >> v[i] >> k[i];
          }
      
          // dp数组,表示容量为j时的最大价值
          vector<int> dp(C + 1, 0);
      
          // 遍历每个物品
          for (int i = 0; i < n; ++i) {
              int count = k[i];
              // 使用二进制拆分,将多重背包转化为多个0/1背包问题
              for (int b = 1; count > 0; b <<= 1) {
                  int num = min(b, count);
                  count -= num;
                  // 更新dp数组,这里从大到小遍历,确保物品只使用一次
                  for (int j = C; j >= num * w[i]; --j) {
                      dp[j] = max(dp[j], dp[j - num * w[i]] + num * v[i]);
                  }
              }
          }
      
          // 输出最终结果,即最大价值
          cout << dp[C] << endl;
      
          return 0;
      }
      
      
      
      • 1

      信息

      ID
      420
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      18
      已通过
      10
      上传者