• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【多重背包 朴素版】洛谷 B2173 多重背包

题目

https://www.luogu.com.cn/problem/B2173

题解

对于 0-1 背包:第 \(i\) 种物品可以选 0, 1 件;

对于多重背包:第 \(i\) 种物品可以选 0, 1, 2, ..., \(w_i\) 件;

将多重背包转化为 0-1 背包求解:把第 \(i\) 件物品转化为 \(w_i\) 件 0-1 背包种的物品,每件物品的体积为 \(k \times u_i\),价值为 \(k \times v_i\)。

时间复杂度:\(O(nm \sum_{i=1}^{n}{w_i})\)
空间复杂度:\(O(m)\)

参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);
    int n, m, u, v, w;
    cin >> n >> m;
    vector<int> dp(m + 1);
    for (int i = 0; i < n; ++ i) {
        cin >> u >> v >> w;// 体积、价值、数量
        for (int j = m; j >= u; -- j) {// 从大到小枚举剩余背包容量(必须从大到小,否则会变为完全背包)
            for (int k = 1; k <= w && k * u <= j; ++ k) {// 将多重背包转化为 0-1 背包
                dp[j] = max(dp[j], dp[j - k * u] + k * v);// 动态转移
            }
        }
    }
    cout << dp[m];// 输出用体积 m 的背包最多能获取的总价值
    return 0;
}

posted on 2026-09-06 21:35  RomanLin  阅读(6)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3