算法学习17:背包问题(动态规划)

算法学习17:背包问题(动态规划)


文章目录

  • 算法学习17:背包问题(动态规划)
  • 前言
  • 一、01背包问题:
    • 1.朴素版:(二维)
    • 2.优化版:(一维)
  • 二、完全背包
    • 1.朴素版:(3重for)
    • 2.稍微优化版:(二维)
    • 3.完全背包问题模版:(最终优化版)
  • 三、多重背包
    • 1.朴素版:()
    • 2.多重背包问题的“二进制优化”:
  • 四、分组背包
    • 在这里插入图片描述
  • 总结


前言

在这里插入图片描述


提示:以下是本篇文章正文内容:

一、01背包问题:


1.朴素版:(二维)

在这里插入图片描述



在这里插入图片描述



// 例题:有n件物品,和一个容量是m的背包,每件物品只能使用一次。
// 第i件物品的体积是vi,价值是wi,
// 求将哪些物品装入背包,可以使总价值最大。
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
int v[N], w[N];// v:体积, w:价值
int f[N][N];// 从前i件物品中取,放到容量为j的背包中,最大的价值。 

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i];
	
	for(int i = 1; i <= n; i ++)
		for(int j = 0; j <= m; j ++)
		{
			f[i][j] = f[i - 1][j];// 不取 
			if(j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);// 取 
		}
		
	cout << f[n][m] << endl;
	return 0;
 } 


在这里插入图片描述



2.优化版:(一维)

// 优化版:
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
int v[N], w[N];// v:体积, w:价值 
int f[N];// 从i件物品中去,放到容量为j的背包,最大的价值。
// 注意要执行i轮循环 

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i];
	
	for(int i = 1; i <= n; i ++)
		// 注意1:如果这里不是倒着遍历,那么可能存在,在前面的时候,i物品已经被放进背包了 
		// 从大到小,保证前面的“状态”,还没有更新过。 
		for(int j = m; j >= v[i]; j --)
			// 不取 和 取 
			f[j] = max(f[j], f[j - v[i]] + w[i]);
		
	cout << f[m] << endl;
	return 0;
 } 


二、完全背包

1.朴素版:(3重for)



在这里插入图片描述



// 例题:有n种物品,容量为m的背包,“每种物品都有无限件可用”。
// 第i件物品的体积是vi,价值是wi,
// 求将哪些物品装入背包,可以使总价值最大,输出最大价值。
#include <iostream>
#include <algorithm>

using namespace std; 

const int N = 1010;

int n, m;
int v[N], w[N];
int f[N][N];

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i];
	
	// 3重for循环: 
	for(int i = 1; i <= n; i ++) 
		for(int j = 0; j <= m; j ++)
			for(int k = 0; k * v[i] <= j; k ++)
			 f[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);
			 
	cout << f[n][m] << endl;
	return 0;
}


在这里插入图片描述



在这里插入图片描述



2.稍微优化版:(二维)

在这里插入图片描述



#include <iostream>
#include <algorithm>

using namespace std; 

const int N = 1010;

int n, m;
int v[N], w[N];
int f[N][N];

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i];

	for(int i = 1; i <= n; i ++) 
		for(int j = 0; j <= m; j ++)
			{
			// 这样就和01背包问题有点像了 
			// 不同的是:f[i - 1][j - v[i]] + w[i] 
			f[i][j] = f[i - 1][j]; 
			// 注意1:要加一个判断条件 (否者越界) 
		 	if(j >= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
			}
		
			 
	cout << f[n][m] << endl;
	return 0;
}


3.完全背包问题模版:(最终优化版)

#include <iostream>
#include <algorithm>

using namespace std; 

const int N = 1010;

int n, m;
int v[N], w[N];
int f[N];

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i];

	for(int i = 1; i <= n; i ++) 
		// 为什么是从前往后遍历,因为每件物品可以使用无限次,不存在重复问题 
		for(int j = v[i]; j <= m; j ++)
		 	f[j] = max(f[j], f[j - v[i]] + w[i]);
		
	cout << f[m]<< endl;
	return 0;
}

三、多重背包

1.朴素版:()



在这里插入图片描述



在这里插入图片描述



2.多重背包问题的“二进制优化”:

在这里插入图片描述



/*
多重背包问题的“二进制优化”: 
请先记住:二进制数的组合可以表示一个0~s范围内的十进制数
那么我们将总数量为s的一个“大包裹”转换为“1 2 4 8 16 32 64 .......”这样的小包裹

然后对于:这些小包裹,我们选择“取或者不取”,这样就把“多重背包问题”转换为“01背包问题” 
*/
/*
注意:为什么要优化?
第一种也可以使用,但是当数据范围大的时候就是出现Time Limit Exceed问题。
(1)0< n, m <100   0< vi, wi, si <100
(2)0 < n <1000 0 < m < 2000 0 < vi, wi, si <2000
const int N = 25000 是如何得到的?1000 * log2(2000) = 1000 * 11 = 22000
*/
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 25000, M = 2010;

int n, m;
int v[N], w[N];
int f[N];

int main()
{
	cin >> n >> m;
	int cnt = 0;// 标记 :作为打包后的总数量 
	for(int i = 1; i <= n; i ++)
	{
		int a, b, s;// 体积,容量,数量 
		cin >> a >> b >> s;
		int k = 1;
		while(k <= s)
		{
			cnt ++;
			v[cnt] = a * k;// 打包后的体积 
			w[cnt] = b * k;// 打包后的容量 
			s -= k;// 剩余的总数量 
			k *= 2;// 打包的件数 
		}
		if(s > 0)// 多了 
		{
			cnt ++;
			v[cnt] = a * s;
			w[cnt] = b * s;
		}
	}
	
	n = cnt;// 打包后的所有包裹的数量
	// 此时,又相当于01背包问题 
	for(int i = 1; i <= n; i ++)
		for(int j = m; j >= v[i]; j --)
			f[j] = max(f[j], f[j - v[i]] + w[i]); 
	
	cout << f[m] << endl;	
	return 0;
 } 


四、分组背包



在这里插入图片描述

在这里插入图片描述

// 有n组物品,容量为m的背包,
// 每组物品有若干个,同一组内的物品最多只能选一个
// 每件物品的体积是vij,价值是wij,其中i是组号,j是组内编号
// 求将哪些物品装入背包,可以使总价值最大,输出最大价值。

/*
输入:n,m
接下来n组数据:
第一行:s表示这一组物品的数量
接下来s行:v,w 
*/

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n, m;
int v[N][N], w[N][N], s[N];
int f[N]; 

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++)
	{
		cin >> s[i];
		for(int j = 0; j <s[i]; j ++)
			cin >> v[i][j] >> w[i][j];
	}
	
	for(int i = 1; i <= n; i ++)
		// 像01背包:“取或不取”,只有一件,不可以重复,那么就倒着遍历,保证前面是未更新的 
		for(int j = m; j >= 0; j --)
			for(int k = 0; k < s[i]; k ++)
				if(v[i][k] <= j)
					f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
					
	cout << f[m] << endl;
	return 0;
 } 


在这里插入图片描述

总结

提示:这里对文章进行总结:
💕💕💕

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

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

相关文章

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html

搭建 Qt 开发环境

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、QT SDK 的下载和安装 1.QT SDK 的下载 二、QT SDK的安装 1、找到下载的文件并双击 2、双击之…

2.人机交互-图形化界面的小故事

文章目录 一、图形化界面的小故事二、什么是cmd&#xff1f; 计算机在刚开始出现的时候&#xff0c;因为占地广、造价高、耗电多&#xff0c;一般都是给军队或者政府使用的&#xff0c;而并不是给个人使用的。然后随着计算机不断地发展&#xff0c;体积越来越小&#xff0c;出现…

深度解析C语言——预处理详解

对C语言有一定了解的同学&#xff0c;相信对预处理一定不会陌生。今天我们就来聊一聊一些预处理的相关知识。预处理是在编译之前对源文件进行简单加工的过程&#xff0c;主要是处理以#开头的命令&#xff0c;例如#include <stdio.h>、#define等。预处理是C语言的一个重要…

数学建模-------MATLAB分支循环断点调试

1.if语句 &#xff08;1&#xff09;分段函数的引入&#xff08;这里的数据表示的是分数的不同区间对应的等级&#xff09; (1)这个就是一个十分简单的if语句&#xff0c;无论是if还是elseif后面都是不能添加任何分号的&#xff0c;这个例子就是一个分段的函数&#xff0c;在不…

空间数据结构(四叉树,八叉树,BVH树,BSP树,K-d树)

下文参考&#xff1a;https://www.cnblogs.com/KillerAery/p/10878367.html 游戏编程知识课程 - 四分树(quadtree)_哔哩哔哩_bilibili 利用空间数据结构可以加速计算&#xff0c;是重要的优化思想。空间数据结构常用于场景管理&#xff0c;渲染&#xff0c;物理&#xff0c;游…

Jamba: A Hybrid Transformer-Mamba Language Model

Jamba: A Hybrid Transformer-Mamba Language Model 相关链接&#xff1a;arXiv 关键字&#xff1a;hybrid architecture、Transformer、Mamba、mixture-of-experts (MoE)、language model 摘要 我们介绍了Jamba&#xff0c;一种新的基于新颖混合Transformer-Mamba混合专家&am…

VMware配置环境(安装运行问题)及系列dns端口网络类型IP远程连接学习之(详谈8000字)

安装vmware快速配置步骤 下载VMware安装包 在下载好VMware安装包之后双击运行 接受条款 关闭VMware自动更新 勾选快捷键方式 安装VMware安装 输入许可证&#xff08;有需要私信小编&#xff09; 安装完成 重启电脑即可 最终成功界面: 安装Linux系统 创建虚拟机 选择…

工业互联网网关软件分析与设计

一、 案例软件分析 一、总体目标 工业互联网是新一代信息技术与制造业深度融合形成的新兴业态和应用模式&#xff0c;其发展前景广阔。工业互联网网关是将各采集监测点的数据通过无线或有线传感网络进行数据汇集&#xff0c;进行统一有效的监管。在工业互联网体系架构中&…

聚焦丨酷雷曼亮相文旅虚拟现实应用推广活动

图片来源&#xff1a;虚拟现实与元宇宙产业联盟XRMA 2024年3月21日&#xff0c;由文化和旅游部产业发展司主办的数字赋能文旅场景建设行动——文化和旅游虚拟现实应用推广交流活动在北京市石景山区首钢园举办。 酷雷曼市场总监刘方磊出席活动&#xff0c;并在活动现场展示酷雷…

【云呐】固定资产盘点报告表怎么填

报告表以表述清晰为主,避免繁琐,重要数据及问题使用表格形式展示。通过签字对报告负责认同度。内容应全面反映本次盘点,提供参考依据。一、标题 包含单位名称、报告期间等基本信息二、前言 概括本次盘点的目的和任务签署三、盘点范围与时间 明确盘点的固定资产项目和时…

【C语言】2048小游戏【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、游戏描述&#xff1a; 2048是一款数字益智类游戏&#xff0c;玩家需要使用键盘控制数字方块的移动&#xff0c;合并相同数字的方块&#xff0c;最终达到数字方块上出现“2048”的目标。 每次移动操作&#xff0c;所…

C++心决之内联函数+auto关键字+指针空值

目录 7.内联函数 7.1 概念 7.2 特性 8. auto关键字(C11) 8.1 类型别名思考 8.2 auto简介 8.3 auto的使用细则 8.4 auto不能推导的场景 9. 基于范围的for循环(C11) 9.1 范围for的语法 9.2 范围for的使用条件 10. 指针空值nullptr(C11) 10.1 C98中的指针空值 7.内联…

RK3568驱动指南|第十四篇 单总线-第165章DS18B20驱动使用ioctl读取分辨率

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

门户系统商城模块

商城系统&#xff1a;快递商品本地团购到店核销购物场景全覆盖&#xff0c;全新商销解决方案 商城系统是指一套用于构建和运营电商平台的软件系统&#xff0c;可以帮助企业快速搭建网上商城&#xff0c;实现商品销售、订单管理、客户服务等功能。 商城系统的功能&#xff1a;…

蓝桥杯-dfs搜索模板题(二)

蓝桥杯-dfs搜索模板题&#xff08;二&#xff09; P1683 入门P1596[USACO10OCT] Lake Counting S1114 棋盘 acwingP1025 [NOIP2001 提高组] 数的划分P1019 [NOIP2000 提高组] 单词接龙结语 P1683 入门 这道题没有回溯的必要&#xff0c;重复走也不计数。最开始的部分要补上。 …

UTAustin最新提出!无相机姿态40秒重建3DGS方法

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程&#xff1a;…

lombok与idea版本不兼容问题解决

lombok与idea版本不兼容问题&#xff0c;可以选择更改lombok版本&#xff1b;也可以选择加配置来解决此问题 1、选择 setting->Build,Execution,Deployment->compiler 2、在 Shared build process VM options中加入如下配置&#xff0c;即可解决此问题 -Djps.track.ap.…

uniapp,文字超出几行显示省略号...,展开显示更多

效果图&#xff1a; 代码&#xff1a; <template><view class"text-container"><text class"text-content" click"showDetail">{{ text }}</text><text v-if"showMore" class"view-detail" cli…

Redis 全景图(2)---- 关于 Redis 的三“高”

前言 我们继续写第一篇文章没写完的。其实我也不想将我写的一篇 Redis 文章分成几篇中短文来写&#xff0c;但是没办法&#xff0c;我一次写个1万字&#xff0c;会限流&#xff0c;所以将就一下吧。 上篇文章我用了 Redis 的6大模块这个思路来描绘我脑子中的 Redis。其实这6大…