动态规划之多重背包模型

2023-11-20

前置知识: 

01背包问题:动态规划之01背包模型_如何何何的博客-CSDN博客

完全背包问题:动态规划之完全背包模型_如何何何的博客-CSDN博客

多重背包问题:

给定一个有一定容量的背包,和 n 个物品,每个物品有 si 件;

每个物品有其对应的体积和价值;

问背包最多能装下的物品的最大价值为多少。

输入格式:

第一行两个整数,N,V,分别表示物品数量和背包容积;

接下来有 N 行,每行两个整数 vi,wi 用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式:

输出一个整数,表示最大价值。

思路:

每件物品的数量是有限的,并且各不相同。并不能和完全背包问题一样优化;

如果数据范围比较小,可在01背包的基础上加上第三重循环(枚举选几件该物品);

故可以将01背包当做特殊的多重背包来处理。

代码模板如下:

//一维
#include<iostream>
using namespace std;

const int N = 110;
int f[N][N];
int n, m;//n件物品,容量是m

int main() {
    cin >> n >> m;

    int v, w, s;
    for (int i = 1; i <= n; i++) {
        cin >> v >> w >> s;

        for (int j = 0; j <= m; j++) {
            f[i][j] = f[i - 1][j];//不选
            for (int k = 0; k <= s; k++)//选k件
                if (k * v <= j)f[i][j] = max(f[i][j], f[i - 1][j - k * v] + k * w);
        }
    }

    cout << f[n][m];

    return 0;
}

//一维
#include<iostream>
using namespace std;

const int N = 110;
int f[N];
int n, m;//n件物品,容量是m

int main() {
    cin >> n >> m;

    int v, w, s;
    for (int i = 1; i <= n; i++) {
        cin >> v >> w >> s;

        for (int j = m; j >= v; j--) {
            for (int k = 0; k <= s; k++)//选k件
                if (k * v <= j)f[j] = max(f[j], f[j - k * v] + k * w);
        }
    }

    cout << f[m];

    return 0;
}

二进制优化:

将每一类物品打包成2^0、2^1、2^2 …… 这样的logn堆物品;

将这些物品进行组合就可以组合出1~n内的任何数量的该物品;

即将所有分好的物品堆进行01背包处理就可以枚举出所有情况。

代码模板如下:
 

#include<iostream>
using namespace std;

const int N = 2010;
int f[N];
int w[N * N], v[N * N], cnt = 0;//最多1000*logn堆物品
int n, V;

int main() {
    cin >> n >> V;

    int v1, w1, s;
    for (int i = 0; i < n; i++) {//打包
        cin >> v1 >> w1 >> s;
        int k = 1;
        while (s) {
            if (s >= k) {
                v[cnt] = k * v1;
                w[cnt++] = k * w1;
                s -= k;
            }
            else {
                v[cnt] = s * v1;
                w[cnt++] = s * w1;
                s = 0;
            }
            k *= 2;
        }
    }

    for (int i = 0; i <= cnt; i++)//01背包
        for (int j = V; j >= v[i]; j--)
            f[j] = max(f[j], f[j - v[i]] + w[i]);

    cout << f[V];
    return 0;
}

例题1 . 庆功会:

信息学奥赛一本通T1269-庆功会 - C语言网 (dotcpp.com)

多重背包裸题,默写多重背包模板即可。

AC代码如下:

#include<iostream>
using namespace std;

const int N = 6010;
int v[N], w[N], cnt = 0;
int f[N];
int n, V;

int main() {
    cin >> n >> V;

    int v1, w1, s;
    for (int i = 0; i < n; i++) {
        cin >> v1 >> w1 >> s;
        int k = 1;
        while (s) {
            if (s >= k) {
                v[cnt] = k * v1;
                w[cnt++] = k * w1;
                s -= k;
            }
            else {
                v[cnt] = s * v1;
                w[cnt++] = s * w1;
                s = 0;
            }
            k *= 2;
        }
    }

    for (int i = 0; i < cnt; i++)
        for (int j = V; j >= v[i]; j--)
            f[j] = max(f[j], f[j - v[i]] + w[i]);

    cout << f[V];

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划之多重背包模型 的相关文章

随机推荐

  • Axure谷歌Chrome浏览器插件安装教程

    1 引言 经常看到这样的问题 1 我用Axure做的原型怎么不能用谷歌浏览器查看 2 到哪里下载Axure谷歌浏览器插件 3 Axure谷歌浏览器插件下载下来怎么安装 其实这些问题百度一下都能找到答案 不过有些答案对于新手来说比较麻烦 就拿
  • c语言函数中调用的参数太多

    c语言函数中调用的参数太多问题 问题展示 问题分析 解决方法 问题展示 图中是我遇到的情况 问题分析 大家可以看到 在函数中 指针变量和后面的整数变量都成了灰色 解决方法 图中问题只需将中文逗号 改为英文逗号即可 一定要检查双引号或者逗号是
  • QT中使用Sqlite

    QT中使用Sqlite 首先要在 pro中引用sql 引用方法 新添加语句 QT sql 在原来的基础上追加 QT core gui sql 然后再widget h中添加对sql头文件的引用 include
  • idea connect timed out 解决方法

    使用IntelliJ IDEA 创建Spring Boot项目时 显示 connect timed out 解决方法 1 很多博客说将 https start spring io 改为 http start spring io 但是我这里不
  • 手动切换 Kinect 的驱动程序(for OpenNI 1.* & Microsoft Kinect SDK 1.7)

    微软最近推出了最新版的 Kinect SDK 能够实现实时的 Kinect Fusion 并提供了丰富的手势交互功能 对体感交互开发人员的吸引力越来越大 而 OpenNI 2 0 以上的版本也转为使用微软官方的 Kinect 驱动 也显示了
  • 移动端适配-01-百分比宽度

    1 图片可以在parent中使用 1 line heigh和text align使水平和竖直居中 2 在img标签中加vertical align middle 2 3 background size 1 两个参数 background s
  • Ubuntu18.04安装cuda10.1+cudnn8.0.5+pytorch1.8.1【亲测~】

    Ubuntu18 04安装cuda10 1 cudnn8 0 5 pytorch1 8 1 亲测 目录 第一步 Cuda10 1的安装 第二步 Cudnn8 05的安装 1 进入官网 https developer nvidia com r
  • [思维模式-15]:《复盘》-3- “行”篇 - 操作复盘- 个人复盘

    目录 前言 一 将军不是教出来的 而是打出来的 二 复盘是能力提升的有效方式 三 对什么进行个人复盘 1 新的事 2 重要的事 3 有价值的事 4 按照规范 惯例处置不太奏效的事件 未达预期的事 四 个人复盘的两种操作手法 1 自我简易复盘
  • cisco 小型园区与网络的构建及其应用

    一 实验目的 熟练构建小型区域网络 二 实验设备 Cisco 2811 路由器 6台 cisco 3650 交换机 6台 cisco 2960 交换机7台 pc机8台 服务器6台 数据线缆若干 三 实验拓扑 四 实验步骤
  • applicationContext.xml第一行无缘无故报错!!!

    eclipse的bug 在projects里clean一下 就好了 右键project的validate不管用
  • python实现OCR识别图片验证码

    用cv2模块读取和显示模块 导包cv2拓展模块 import cv2 先给窗体起名字 cv2 namedWindow ShowImage1 cv2 namedWindow ShowImage2 image1 cv2 imread img01
  • 04757信息系统开发与管理2011版考试大纲思维导图

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 不考 思维导图下载地址 MindMaster绘制 链接 https pan baidu com s 1U BRcRyUgZ8QUqlDuOLy w pwd qwzt 提
  • 通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题

    通过 raft 的 leader lease 来解决集群脑裂时的 stale read 问题 问题 当 raft group 发生脑裂的情况下 老的 raft leader 可能在一段时间内并不知道新的 leader 已经被选举出来 这时候
  • C语言冒泡排序和选择排序

    一 冒泡排序法 假设从小到大排序 例一数组 int arr 2 1 34 5 arr 0 先跟相邻的arr 1 比较大小 如果比它大则交换两个数值位置 大的数值放在后面 然后比较arr 1 和arr 2 的大小 以此类推 直至第n 2个和第
  • MCDF实验——Lab0

    MCDF实验 一 MCDF功能描述 二 设计结构 三 接口描述 1 系统信号接口 2 通道从端接口 3 整形器接口 4 控制寄存器接口 四 接口时序 1 通道从端接口时序 2 整形器接口时序 3 控制寄存器接口时序 五 寄存器描述 1 地址
  • day4-Django的model

    目录 1 setting文件配置 2 理解models 3 model定义 4 常用字段类型 5 常用属性 6 数据库迁移 7 Meta类 1 setting文件配置 sqlite数据库 DATABASES default ENGINE d
  • AIGC潮水中,重新理解低代码

    如果将一句话生成应用形容成L4级的 无人驾驶 伙伴云的 AI搭建 则更像L2 级的 辅助驾驶 作者 斗斗 出品 产业家 2023年 AIGC下的低代码赛道 暗流涌动 对于 AI搭建 的搭建效果 尤其是在场景覆盖的广度上 连我自己也感觉比较意
  • Qt Creator创建C++(Day1)

    利用Qt Creator创建纯C 项目流程 1 如下图所示 按照序号选择即可 2 更改名字和选择保存路径 3 点击 下一步 4 直接点击 完成 注意事项 如果在控制台输出中文乱码修改过程如下 1 选中 工具 选项 2 将 UTF 8 改为
  • 语音活性检测器 webrtcvad

    目录 概述 安装 使用脚本 1 测试静音片段 2 清理静音片段 概述 WebRTC是一个免费 开放的框架 项目 使web浏览器通过简单的JavaScript api接口实现实时通信功能 WebRTC An open framework fo
  • 动态规划之多重背包模型

    前置知识 01背包问题 动态规划之01背包模型 如何何何的博客 CSDN博客 完全背包问题 动态规划之完全背包模型 如何何何的博客 CSDN博客 多重背包问题 给定一个有一定容量的背包 和 n 个物品 每个物品有 si 件 每个物品有其对应