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

引言

多重背包,相对于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,不能为0

bool 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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【FAS】《Liveness Detection on Face Anti-spoofing》

文章目录 原文总结与评价CNN-RNN vs 三维卷积作者的方法 原文 [1]欧阳文汉.反人脸图像欺诈的活体识别方法研究[D].浙江大学,2020.DOI:10.27461/d.cnki.gzjdx.2020.002675. 总结与评价 时序运动信息与传统的空间纹理信息相结合 基于相位平移的运动放大算法不错 视觉大小细胞…

【Python报错】已解决Attributeerror: ‘list‘ object has no attribute ‘join‘( Solved)

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘join’ (Solved) 在Python中&#xff0c;字符串&#xff08;str&#xff09;对象有一个非常有用的join()方法&#xff0c;它允许你将序列中的元素连接&#xff08;join&#xff09;成一个字符串…

深入理解C++三五零法则

三五零法则就是三法则&#xff08;The Rule of Three&#xff09;、五法则&#xff08;The Rule of Five&#xff09;、零法则&#xff08;The Rule of Zero&#xff09;。三五零法则是和C的特殊成员函数有关&#xff0c;特别是那些涉及对象如何被创建、复制、移动和销毁的函数…

苹果不会在WWDC 2024中推出任何搭载M4芯片的Mac电脑

虽然苹果公司已在上月推出了首搭 M4 芯片的 iPad Pro&#xff0c;不过彭博社的马克・古尔曼在最近的实时通讯中透露苹果公司不会在即将进行的 WWDC 2024 开发者大会中推出任何搭载 M4 芯片的 Mac 电脑&#xff08;不会推出任何硬件产品&#xff09;。 此前报道&#xff0c;苹果…

如何自动生成数据库的样本数据(以MySQL和SQLynx为例)

目录 1 功能概述 2 主要特点 3 使用场景 4 使用示例 5 结论 SQLynx 是一款领先的 SQL 集成开发环境&#xff08;IDE&#xff09;&#xff0c;其强大的功能得到了全球用户的广泛认可。SQLynx 不仅在数据库管理和 SQL 查询方面表现出色&#xff0c;还提供了一项特别实用的功能…

【Python报错】已解决AttributeError: ‘method‘ object has no attribute ‘xxx‘

解决Python报错&#xff1a;AttributeError: ‘method’ object has no attribute ‘xxx’ 在Python中&#xff0c;AttributeError通常表明你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: method object has no attribute xxx的错误&#xff0c;这通常意…

宇宙数字宣布2023年上半年盈利翻倍,数字货币挖矿业务持续增长

2023年3月8日宇宙数字公司在2023年上半年盈利翻倍的消息,彰显了该公司在数字货币挖矿领域的卓越表现和领先地位。这一成就是宇宙数字创新研发策略成功的明证,同时也体现了其高效能挖矿产品和解决方案在全球市场的广泛认可和需求。 随着数字货币市场的持续变化和发展,宇宙数字公…

15- Redis 中的 整数集合 数据结构

整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不大时&#xff0c;就会使用整数集合这个数据结构作为底层实现。 1. 整数集合结构设计 整数集合本质上是一块连续内存空间&#xff0c;它的结构定义如下&#xff1a; typedef s…

七月份大理站、ACM独立出版、高录用稳检索,2024年云计算与大数据国际学术会议(ICCBD 2024)

【ACM独立出版 | 高录用 | EI核心检索稳定】 2024年云计算与大数据国际学术会议&#xff08;ICCBD 2024) 2024 International Conference on Cloud Computing and Big Data (ICCBD 2024) 一、重要信息 大会官网&#xff1a;www.iccbd.net &#xff08;点击投稿/参会/了解会…

c语言速成系列指针上篇

那么这一篇文章带大家学习一下c语言的指针的概念、使用、以及一些注意事项。 指针的概念 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址的变量。就像其他变量或常量一样&#xff0c;您必须在使用指针存储其他变量地址之前&#xff0c;对其进行声明。 大白话讲解…

【TB作品】MSP430F149 单片机 音乐喷泉

功能 声音越大&#xff0c;亮的灯越多。 oled显示出当前的声音大小。 硬件接线 //OLED----MSP430 //VCC-----3.3V //GND-----GND //D0------P3.2 //D1------P3.0 //RES-----P2.0 //DC------P2.2 //CS------P8.1 led P4八个引脚 adc P6.0 部分代码 _EINT();while (1){adok…

移动端 UI 风格,打造极致体验

移动端 UI 风格&#xff0c;打造极致体验

Python疑难杂症--考试复习

1.排序输出字典中数据 dic1 {Tom:21,Bob:18,Jack:23,Ana:20} dic2 {李雷:21,韩梅梅:18,小明:23,小红:20} nint(input()) if n>len(dic1):nlen(dic1) print(sorted(dic1.keys())[:n]) print(sorted(dic2.items(),keylambda item:item[1])[:n]) 2.罗马数字转换 def F(s):d{…

上位机图像处理和嵌入式模块部署(f407 mcu中的项目开发特点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和soc相比较&#xff0c;mcu的项目规模一般不算大。因为&#xff0c;soc项目中&#xff0c;从规划、硬件开发、驱动、应用端、服务器端到测试&…

蓝桥杯物联网竞赛 比赛总结

CUBEMX配置建议&#xff1a; 对于CUBEMX配置来说stm32l071kbu6的引脚不算太多&#xff0c;功能模块相对的也不多&#xff0c;所以我建议直接熟练到能将所有模块烂熟于心&#xff0c;不用看原理图就能熟练配置下来&#xff0c;因为国赛看原理图去配置太花费时间 我建议学习的时…

【设计模式深度剖析】【4】【行为型】【策略模式】

文章目录 策略模式定义英文原话直译 角色类图策略接口Strategy&#xff1a;具体策略类上下文类Context测试类 策略模式的应用策略模式的优点策略模式的缺点策略模式的使用场景 策略模式 策略模式&#xff08;Strategy Pattern&#xff09; Strategy策略也称作Policy政策。 想…

Springboot jar运行时,将jar内的文件拷贝到文件系统中

背景 因为执行需要&#xff0c;需要把jar内templates文件夹下的的文件夹及文件加压到宿主机器的某个路径下&#xff0c; 以便执行对应的脚本文件 PS: 通过类加载器等方式&#xff0c;直接getFile遍历文件&#xff0c;在idea中运行是没问题的&#xff0c;但是当打包成jar运行就会…

【JavaEE】留言板与图书管理系统

目录 留言板1. 准备工作2. 约定前后端交互接口lombok3. 服务器代码4. 调整前端页面代码 图书管理系统1. 准备工作2. 约定前后端交互接口3. 服务器代码4. 调整前端页面代码 留言板 需求: 界⾯如下图所⽰ 输⼊留⾔信息, 点击提交. 后端把数据存储起来.⻚⾯展⽰输⼊的表⽩墙的信…

Mysql使用中的性能优化——搭建Mysql的监测服务

大纲 环境安装配置Mysql安装设置root密码新增远程访问账户修改绑定地址重启 新增 MySQL Server Exporter 用户 安装启动mysqld_exporter安装启动新增配置启动 安装启动Prometheus创建用户下载并解压修改配置启动 安装启动grafana安装启动 测试参考资料 抛开场景和数据&#xff…

【YOLOv8改进[CONV]】SPDConv助力YOLOv8目标检测效果 + 含全部代码和详细修改方式 + 手撕结构图

本文将使用SPDConv助力YOLOv8目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法。 改进前和改进后的参数对比: 目录 一 SPDConv 二 SPDConv助力YOLOv8目标检测效果 1 整体修改 ① 添加SPDConv.py文件 ② 修改ultralytics/nn/tas…