当前位置: 首页 > 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. 搭…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...