当前位置: 首页 > news >正文

动态规划(多重背包问题+二进制优化)

引言

多重背包,相对于01背包来说,多重背包是每个物品会有相应的个数,最多可以选那么多个,因而对于朴素多重背包,需要在01背包的基础上,再加一层物品的循环

朴素多重背包例题

P2347 [NOIP1996 提高组] 砝码称重

题意,就是说有六种砝码每种砝码有自己的个数,问你能达到的重量搭配是多少

题解:标准的多重背包,我们可以用dp[ j ]去表示 j 重量能否达到,如果能达到就是1,如果不能打达到就是0,最后遍历一遍dp数组去判断有多少个1即可

#include<bits/stdc++.h>
using namespace std;
int a[7];
int w[7]={0,1,2,3,5,10,20};
int dp[1050];int main()
{for(int i=1;i<=6;i++)cin>>a[i];dp[0]=1;for(int i=1;i<=6;i++){for(int j=1050;j>=0;j--){for(int k=0;k<=a[i];k++)//遍历第i个物品选的个数{if(dp[j]==1){dp[j+k*w[i]]=1;}}}}int sum=0;for(int i=1;i<=1000;i++)if(dp[i]!=0)sum++;cout<<"Total="<<sum;return 0;
}

 P6771 [USACO05MAR] Space Elevator 太空电梯

题意,就是说给你n中方块,每个方块有自己的高度,和最大搭建的限制(在某个高度以后不能用这种方块),还有方块的数量

思路:这是一个变式,我们需要将其组装成一个结构体,然后对a数组进行排序,从小到大进行排序,然后进行多重背包即可

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{int h;int limit;int num;
}a[405];
int dp[40005];//能否达到高度为j,能达到为1,不能为0bool cmp(node a,node b)
{return a.limit<b.limit;
}int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i].h>>a[i].limit>>a[i].num;dp[0]=1;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){for(int j=a[i].limit;j>=0;j--){for(int k=0;k<=a[i].num&&j+k*a[i].h<=a[i].limit;k++){if(dp[j]==1){dp[j+k*a[i].h]=1;}}}}for(int i=a[n].limit;i>=0;i--){if(dp[i]==1){cout<<i;return 0;}}return 0;
} 

 P5365 [SNOI2017] 英雄联盟

 题意:有n个英雄,每个英雄有k个皮肤,对于一个英雄的所有皮肤都是一个价格c,但是我又想要m中搭配,正常的求法是算出m个搭配至少要多少钱,但是这题m的数据太大了,只能通过对于一定的钱,其搭配数是多少

思路:dp数组表示的是对于j元,总共有多少的搭配数,然后判断这个搭配数是否大于m从前向后遍历,找到第一个大于m种搭配的位置,那个下标就是最小花费

//英雄联盟 
//这题皮肤搭配数量太大了,肯定不能当数组,要换成j个q币能搞得最大皮肤搭配 
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int num[135];
int w[135];
int dp[270005];
signed main()
{cin>>n>>m;int sum=0;//计算总金额 for(int i=1;i<=n;i++){cin>>num[i];}for(int i=1;i<=n;i++){cin>>w[i];sum+=num[i]*w[i];}dp[0]=1;for(int i=1;i<=n;i++){for(int j=sum;j>=0;j--){for(int k=0;k<=num[i]&&k*w[i]<=j;k++){dp[j]=max(dp[j],dp[j-k*w[i]]*k);}}}for(int i=1;i<=sum;i++){if(dp[i]>=m){cout<<i;return 0;}}return 0;
}

二进制优化

用到的是二进制拆分思想

比如说对于50这个数,我们用二进制拆分可以分为 1,2,4,8,16,19,这五个数,我们这五个数搭配可以组成50以内的所有自然数,所以我们二进制优化也是通过拆分每个物品的个数从而降低时间复杂度,从而形成完全的01背包问题

二进制优化例题

P1776 宝物筛选

一看这道题,如果用正常的多重背包,时间复杂度为100*40000*100000肯定会爆数据的,所以我们要用二进制优化,将时间复杂度变为4e6*log2(100000),这样就大大降低的时间的复杂度

将物品数量进行二进制拆分

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int v[1405];
int w[1405];
int dp[40005];signed main()
{cin>>n>>m;int vv,ww,mm;int cnt=0;for(int i=1;i<=n;i++){cin>>vv>>ww>>mm;for(int j=1;j<=mm;j<<=1){cnt++;v[cnt]=j*vv;w[cnt]=j*ww;mm-=j;}if(mm){cnt++;v[cnt]=mm*vv;w[cnt]=mm*ww;}}for(int i=1;i<=cnt;i++){for(int j=m;j>=w[i];j--){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}cout<<dp[m];return 0;
}

 

相关文章:

动态规划(多重背包问题+二进制优化)

引言 多重背包&#xff0c;相对于01背包来说&#xff0c;多重背包是每个物品会有相应的个数&#xff0c;最多可以选那么多个&#xff0c;因而对于朴素多重背包&#xff0c;需要在01背包的基础上&#xff0c;再加一层物品的循环 朴素多重背包例题 P2347 [NOIP1996 提高组] 砝…...

AI学习指南机器学习篇-逻辑回归正则化技术

AI学习指南机器学习篇-逻辑回归正则化技术 在机器学习领域&#xff0c;逻辑回归是一种常见的分类算法&#xff0c;它常用于处理二分类问题。在实际的应用中&#xff0c;为了提高模型的泛化能力和降低过拟合风险&#xff0c;逻辑回归算法通常会使用正则化技术。本文将介绍逻辑回…...

Django按照文章ID删除文章

重点是‘文章的ID’作为参数&#xff0c;如何在各个部分传递。 1、在视图函数部分 login_required def article_list(request):articles ArticlePost.objects.filter(authorrequest.user)context {articles: articles, }return render(request, article/column/article_lis…...

Java | Leetcode Java题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }...

文件系统小册(FusePosixK8s csi)【1 Fuse】

文件系统小册&#xff08;Fuse&Posix&K8s csi&#xff09;【1 Fuse&#xff1a;用户空间的文件系统】 Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持&#xff0c;开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文…...

Bootstrap 环境安装

Bootstrap 环境安装 Bootstrap 是一个流行的前端框架,用于快速开发响应式和移动设备优先的网站。在开始使用 Bootstrap 之前,您需要安装相应的环境。本文将指导您如何安装 Bootstrap 环境。 1. 环境要求 在开始之前,请确保您的计算机上已安装以下软件: Node.js:Bootstr…...

GWT 与 Python App Engine 集成

将 Google Web Toolkit (GWT) 与 Python App Engine 集成可以实现强大的 Web 应用程序开发。这种集成允许你使用 GWT 的 Java 客户端技术构建丰富的用户界面&#xff0c;并将其与 Python 后端结合在一起&#xff0c;后端可以运行在 Google App Engine 上。 1、问题背景 在 Pyt…...

golang的函数为什么能有多个返回值?

在golang1.17之前&#xff0c;函数的参数和返回值都是放在函数栈里面的&#xff0c;比如函数A调用函数B&#xff0c;那么B的实参和返回值都是存放在函数A的栈里面&#xff0c;所以可以轻松的返回多个值。 其他的编程语言大都使用某个寄存器来存储函数的返回值。 但是从golang…...

一次 K8s 故障诊断:从 CPU 高负载到存储挂载泄露根源揭示

一、背景 现代软件部署中&#xff0c;容器技术已成为不可或缺的一环&#xff0c;在云计算和微服务架构中发挥着核心作用。随着容器化应用的普及&#xff0c;确保容器环境的可靠性成为了一个至关重要的任务。这就是容器SRE&#xff08;Site Reliability Engineering&#xff0c…...

python大作业:实现的简易股票简易系统(含源码、说明和运行截图)

实现一个简单的股票交易模拟系统。该系统将包括以下几个部分: 数据处理:从CSV文件中读取股票数据。 股票交易算法:实现一个简单的交易策略。 命令行界面(CLI):允许用户查看股票数据和进行交易。 数据持久化:将用户的交易记录和当前资金存储在数据库中。 为了简化这个示例…...

python-NLP常用数据集0.1.012

XNLI数据集 用户语言翻译和跨语言分类的语料库 官网地址&#xff1a;https://github.com/facebookresearch/XNLI下载地址&#xff1a;https://dl.fbaipublicfiles.com/XNLI/XNLI-1.0.zip注意事项&#xff1a;数据集有json格式的&#xff0c;和txt格式的数据格式 txt格式 la…...

【大事件】docker可能无法使用了

今天本想继续学习docker的命令&#xff0c;突然发现官方网站的文档页面打不开了。 难道是被墙了&#xff1f; 我用同事的翻了一下&#xff0c;能进&#xff0c;果然&#xff01; 正好手头的工作告一段落&#xff0c;将代码上传&#xff0c;然后通过jenkins将服务器自动部署到…...

探索Linux中的gzip命令:压缩与解压缩的艺术

探索Linux中的gzip命令&#xff1a;压缩与解压缩的艺术 在Linux世界中&#xff0c;文件压缩和解压缩是日常任务中不可或缺的一部分。gzip命令是这些任务中的佼佼者&#xff0c;它提供了高效的压缩和解压缩功能&#xff0c;广泛应用于各种场景。本文将带您深入了解gzip命令的工…...

Shell 输入/输出重定向

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

为什么RPC要比Http高效?

RPC和HTTP RPC&#xff08;Remote Procedure Call&#xff09;基于TCP连接通常比HTTP在性能上要高很多&#xff0c;原因如下&#xff1a; 1. 协议开销 HTTP开销&#xff1a; HTTP协议报文头部相对较大&#xff0c;包含大量的元数据&#xff08;如方法、URI、头字段等&#x…...

局域网电脑监控软件是如何监控到内网电脑的?

在信息化快速发展的今天&#xff0c;局域网电脑监控软件成为许多企业、学校和机构重要的实用工具。这些软件的主要功能在于对局域网内的电脑进行实时监控&#xff0c;以确保网络的安全、员工的工作效率以及合规性。那么&#xff0c;局域网电脑监控软件是如何做到对内网电脑进行…...

精妙无比的App UI 风格

精妙无比的App UI 风格...

SQL优化系列-快速学会分析SQL执行效率(下)

1 show profile 分析慢查询 有时需要确定 SQL 到底慢在哪个环节&#xff0c;此时 explain 可能不好确定。在 MySQL 数据库中&#xff0c;通过 profile&#xff0c;能够更清楚地了解 SQL 执行过程的资源使用情况&#xff0c;能让我们知道到底慢在哪个环节。 知识扩展&#xff1…...

交流非线性RCD负载的核心功能

非线性RCD负载是一种广泛应用于电力系统中的电子元件&#xff0c;主要用于保护电路免受过电压和欠电压的影响。它的核心功能主要包括以下几个方面&#xff1a; 1. 过电压保护&#xff1a;当电路中的电压超过设定值时&#xff0c;非线性RCD负载会自动断开电路&#xff0c;防止电…...

英语学习笔记31——Where‘s Sally?

Where’s Sally? Sally在哪&#xff1f; 词汇 Vocabulary garden /ˈɡɑːrdn/ n. 花园&#xff0c;院子&#xff08;属于私人&#xff09; 区别&#xff1a;park n. 公园&#xff08;公共的&#xff09; 例句&#xff1a;我的花园非常大。    My garden is very big. 搭…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...