多重背包问题 ⅠⅡ Ⅲ

有 N 种物品和一个容量是 V 的背包。
第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

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

Input
4 5
1 2 3
2 4 1
3 4 3
4 5 2

Output
10

根据不同的数据范围,有不同的选择

Ⅰ.  数据范围   0<N,V≤100  0<vi,wi,si≤100      

直接写

//代码一
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=510,M=6010;
int n,m;
int v,w,s;
int f[N][M];
void solve()
{cin>>n>>m;for (int i=1;i<=n;i++){cin>>v>>w>>s;for (int j=1;j<=m;j++)for (int k=0;k<=s&&k*v<=j;k++)f[i][j]=max(f[i][j],f[i-1][j-k*v]+k*w);}cout<<f[n][m];
}
signed main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}//代码二:降一维
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=510,M=6010;
int n,m;
int v,w,s;
int f[M];
void solve()
{cin>>n>>m;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*v<=j;k++)f[j]=max(f[j],f[j-k*v]+k*w);}cout<<f[m];
}
signed main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}

Ⅱ.  数据范围   0<N≤1000,0<V≤2000,0<vi,wi,si≤2000      

通过二进制将每种物品按照个数的不同重新打包,再按01背包的方式选择

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=1e6+10;
int n,m;
int f[N],v[N],w[N];
int cnt;
void solve()
{cin>>n>>m;for (int i=1;i<=n;i++){int a,b,s;cin>>a>>b>>s;int k=1;while (k<=s){cnt++;v[cnt]=k*a;w[cnt]=k*b;s -=k;k *=2;}if (s>0){cnt++;v[cnt]=s*a;w[cnt]=s*b;}}for (int i=1;i<=cnt;i++)for (int j=m;j>=v[i];j--)f[j]=max(f[j],f[j-v[i]]+w[i]);cout<<f[m];
}
signed main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}

Ⅲ.  数据范围   0<N≤1000,0<V≤20000,0<vi,wi,si≤20000

通过单调队列来更新状态

//代码一
#include <bits/stdc++.h>
using namespace std;
//#define int long long         //不开就不开吧
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=1010,M=2e4+10;
int n,m;
int f[N][M],q[M];
void solve()
{cin>>n>>m;for (int i=1;i<=n;i++){int v,w,s;cin>>v>>w>>s;for (int j=0;j<v;j++){int hh=0,tt=-1;for (int k=j;k<=m;k +=v){if (hh<=tt&&k-q[hh]>s*v) hh++;      //判断队头是否滑出窗口,队列中的v不能超过上限s个while (hh<=tt&&f[i-1][q[tt]]-(q[tt]-j)/v*w<=f[i-1][k]-(k-j)/v*w) tt--;q[++tt]=k;f[i][k]=f[i-1][q[hh]]+(k-q[hh])/v*w;}}}cout<<f[n][m];
}
int main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}//代码二 降一维
#include <bits/stdc++.h>
using namespace std;
//#define int long long         //不开就不开吧
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e4+10;
int n,m;
int f[N],g[N],q[N];
void solve()
{cin>>n>>m;for (int i=1;i<=n;i++){int v,w,s;cin>>v>>w>>s;memcpy(g,f,sizeof f);       //滚动数组,备份上一次的状态for (int j=0;j<v;j++){int hh=0,tt=-1;for (int k=j;k<=m;k +=v){if (hh<=tt&&k-q[hh]>s*v) hh++;      //判断队头是否滑出窗口,队列中的v不能超过上限s个while (hh<=tt&&g[q[tt]]-(q[tt]-j)/v*w<=g[k]-(k-j)/v*w) tt--;q[++tt]=k;f[k]=g[q[hh]]+(k-q[hh])/v*w;}}}cout<<f[m];
}
int main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发理论之页面和自定义组件生命周期

1、自定义组件和页面的关系 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c;即页面的根节点&#xff0c;一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…

基于轻量级模型YOLOX-Nano的菜品识别系统

工程Gitee地址&#xff1a; https://gitee.com/zhong-liangtang/ncnn-android-yolox-nano 一、YOLOX简介 YOLOX是一个在2021年被旷视科技公司提出的高性能且无锚框&#xff08;Anchor-free&#xff09;的检测器&#xff0c;在YOLO系列的基础上吸收近年来目标检测学术界的最新…

【PyTorch】PyTorch中张量(Tensor)计算操作

PyTorch深度学习总结 第五章 PyTorch中张量(Tensor)计算操作 文章目录 PyTorch深度学习总结前言一、张量比较大小1、torch.allclose()2、torch.eq()和torch.equal()3、ge、gt、le、lt、ne函数4、torch.isnan() 二、基本运算1、四则运算(加减乘除)2、其他计算 前言 上文介绍了…

零基础学python之高级编程(3)---面向对象多态与封装(含有代码示例)

面向对象多态与封装 文章目录 面向对象多态与封装前言一、多态方法重写&#xff08;Overriding&#xff09;方法重载(Overloading)抽象基类和接口&#xff08;Abstract Base Classes and Interfaces&#xff09; 二、封装私有变量和私有方法属性装饰器(property) 和 getter和se…

C++自动变量和static声明静态局部变量

C中的自动变量是指在函数内部声明的变量&#xff0c;其作用域仅限于该函数。这些变量会在程序执行到其所在的代码块时被创建&#xff0c;并在代码块执行结束后被销毁。 下面是一个示例 C 代码&#xff0c;展示了如何声明和输出自动变量和整型变量&#xff1a; #include <i…

AI绘画作品的展示和变现

AI绘画作品的展示和推广技巧 如何通过AI绘画打造独特的个人IP 4.1 AI绘画作品买卖 平台一&#xff1a;抖音 抖音平台有「抖音图文扶持计划」&#xff0c;还会不定期推出图文伙伴计划、图文热点来了等&#xff0c;大家起号的时候更容易 当你的每篇作品阅读量稳定在 1W 时&…

大话设计模式——1.模板方法模式(Template Method Pattern)

定义&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 例子&#xff1a;比较重大的考试往往有A、B两套试卷&#xff0c;其中一套出现问题可以立马更换另一套。 定义基…

字符串匹配之Z函数算法和KMP算法

目录 1 介绍1.1 Z函数算法2.2 KMP算法 2 训练 1 介绍 1.1 Z函数算法 Z函数算法&#xff0c;也叫作扩展KMP算法。它用来求取文本串text和模式串pattern的匹配位置。 首先介绍lcp(s1,s2)函数&#xff0c;它表示字符串s1和字符串s2的最大公共前缀长度。那么z[i] lcp(text, tex…

寒冰姐直播的一个开场加七个流程文字版(加强版)

寒冰姐直播开场版&#xff08;非常关键&#xff0c;让系统判定您在直播中&#xff09;&#xff1a; 大家在打开抖音直播后&#xff0c;3,2,1&#xff0c;开播就要说话&#xff0c;让抖音识别到你要开播&#xff0c;因为抖音有三大识别系统&#xff0c;文字识别系统、语音识别系…

2.12.。

1、选择芯片型号——STM32F051K8 2、开启调试功能 3、配置时钟 4、配置时钟树 5、工程管理

three.js 细一万倍教程 从入门到精通(一)

目录 一、three.js开发环境搭建 1.1、使用parcel搭建开发环境 1.2、使用three.js渲染第一个场景和物体 1.3、轨道控制器查看物体 二、three.js辅助设置 2.1、添加坐标轴辅助器 2.2、设置物体移动 2.3、物体的缩放与旋转 缩放 旋转 2.4、应用requestAnimationFrame …

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

海里定理例题

1. lim ⁡ x − > 0 s i n ( 1 x ) \lim\limits_{x ->0}sin(\frac{1}{x}) x−>0lim​sin(x1​)的极限不存在 取数列f(x), x n 1 2 n Π − Π 2 x_n\frac{1}{2nΠ-\frac{Π}{2}} xn​2nΠ−2Π​1​和 y n 1 2 n Π Π 2 y_n\frac{1}{2nΠ\frac{Π}{2}} yn​2nΠ2…

Hive SQL编译成MapReduce任务的过程

一、 Hive 底层执行架构 1&#xff09; Hive简介 Hive是Facebook实现的一个开源的数据仓库工具。将结构化的数据文件映射为数据库表&#xff0c;并提供HQL查询功能&#xff0c;将HQL语句转化为MapReduce任务运行 2&#xff09; Hive本质&#xff1a;将 HQL 转化成 MapReduce 程…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息删除实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

【51单片机】串口通信实验(包括波特率如何计算)

目录 串口通信实验通信的基本概念串行通信与并行通信异步通信与同步通信单工、 半双工与全双工通信通信速率 51单片机串口介绍串口介绍串口通信简介串口相关寄存器串口工作方式方式0方式1方式 2 和方式 3 串口的使用方法&#xff08;计算波特率&#xff09; 硬件设计软件设计1、…

基于微信天津某健身房私教预约小程序系统设计与实现 研究背景和意义、国内外现状

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

【前端高频面试题--虚拟DOM篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--虚拟DOM篇 虚拟DOM的理解虚拟DOM的解析过程为什么要用虚拟DOM虚拟DOM与真实DOM的…

类与结构体(6)

我们上一起讲了这一期讲存储类和继承&#xff0c;这个难度很大的。 存储类 存储类主要规定了函数和变量的范围&#xff0c;在c中有这些存储类↓&#xff1a; ৹ auto&#xff08;自动判断函数是什么类型&#xff09; ৹ register (常用的变量和inline差不多&#xff0c;但应…