二维背包(包含优化)

2023-10-27

二维背包

二维背包

二维背包相较于01背包,多了一个限制,就是背包的重量有了限制,但是其本质和01背包并没有什么区别,只是多遍历一轮。

f(i,j,k)状态表示:解锁了前i个物品,背包可以承载体积为j,可以承重为w。

状态转移方程:f(i,j,k)=max( f(i-1,j,k),f(i-1,j-v,k-w)+vi) )

本质和01背包转移方程一致,区分为拿第i种物品,和不拿第i种物品,转移的状态一定是最近的关系,这样才能保证每种状态下都是最优解。

代码

#include<bits/stdc++.h>
#define ll long long

using namespace std;

const int N=1010;
int n,V,M;

int f[N][110][110];




int main() {

	cin>>n>>V>>M;//输入物品个数,背包容积, 可承受最大重量


	for(int i=1; i<=n; i++) {
		int v,m,w;//每个物品的体积,重量,价值
		cin>>v>>m>>w;
		for(int j=0; j<=V; j++) {
			for(int k=0; k<=M; k++) {
				if(j>=v&&k>=m)//背包体积和称重都满足 
					f[i][j][k]=max(f[i-1][j][k],f[i-1][j-v][k-m]+w);//状态转移方程
				else f[i][j][k]=f[i-1][j][k];//不满足时直接继承上一轮结果 
			}
		}
	}
	cout<<f[n][V][M]<<endl;


	return 0;
}

优化为二维

既然01背包都可以优化,那么我们理所应当可以优化二维背包状态数组

由于每次遍历体积和重量时,根据状态转移方程f(i,j,k)=max( f(i-1,j,k),f(i-1,j-v,k-w)+vi) ),每次j和k都需要j-v,和k-w,也就是需要比他们小的状态,并且第i轮只和第i-1轮相关,不受之前影响,那么我们可以把它优化为f(i,j)数组,只需要将体积和重量从后向前遍历,这样每次可以拿到上一轮的j-v和k-w,实质就是打了个时间差。

#include<bits/stdc++.h>
#define ll long long

using namespace std;

const int N=110;
int n,V,M;

int f[N][N];




int main() {

	cin>>n>>V>>M;//输入物品个数,背包容积, 可承受最大重量


	for(int i=0; i<n; i++) {
		int v,m,w;//每个物品的体积,重量,价值
		cin>>v>>m>>w;
		for(int j=V; j>=v; j--) { //体积从后向前(j<=v时自然继承上一轮,也就不用处理)
			for(int k=M; k>=m; k--) {
				f[j][k]=max(f[j][k],f[j-v][k-m]+w);//状态转移方程
			}
		}
	}
	cout<<f[V][M]<<endl;


	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维背包(包含优化) 的相关文章

随机推荐

  • Qt新建项目No valid kits found解决思路

    第一次用Qt Creator创建Project时 进入Kit Selection窗口后 会提示No Valid kits found Please add a kit in the options
  • web性能测试基本性能指标

    文章出处 https blog csdn net qiguiting article details 11584397 Web性能测试的部分概况一般来说 一个Web请求的处理包括以下步骤 1 客户发送请求 2 web server接受到请求
  • Source Insight 4.0常用设置

    1 删除某一个或多个无用的project 历史project 用十六进制编辑器打开 我的文档 Source Insight 4 0 Projects project list sidb 文件 找到你要删除的项目路径及名称字符串 用0替换相关
  • TortoiseGit实现分支的新增、合并、删除详细教程

    分支的新增 合并 删除 关于git分支的操作 内容较多 所以从上篇博客 Windows下TortoiseGit客户端安装 中单独提取了出来 16 创建分支 Create Branch 关于Git Branch 在实际的项目开发过程中 这个非
  • ROS学习笔记(一)

    一 ROS安装与测试 Ubuntu和ROS版本的对应关系 网上教程很多 本人主要参考以下几篇 官网教程 全英文 ROS安装教程 ROS kinetic 超详细安装教程 安装过程中报错以及参考文章 均能有效解决 安装完ROS后 初始化rosd
  • 总结Pyinstaller的坑及终极解决方法

    一 首先要有个稳定环境 下面是博主经测试的觉得坑比较少的环境搭配 Python3 4 PyQt5 4 Pyinstaller3 2 1 Python3 5 PyQt5 8 Pyinstaller3 2 1 二 Pyinstaller遇到坑没
  • el-table表头无法居中显示(使用了cell-style和header-cell-style属性,也没有效果)----解决办法

    解决办法 cell style和header cell style属性要写在style前面
  • Windows Server 2016组策略限制用户登录到本机

    打开组策略 编辑 设置允许本地登录 拒绝本地登录 刷新组策略
  • 【EI会议征稿】第三届机械自动化与电子信息工程国际学术会议(MAEIE 2023)

    第三届机械自动化与电子信息工程国际学术会议 MAEIE 2023 第三届机械自动化与电子信息工程国际学术会议 MAEIE 2023 将于2023年12月15 17日在江苏南京举行 本会议通过与业内众多平台 社会各团体协力 聚集机械自动化 电
  • 嵌入式Linux应用开发笔记:串口

    文章目录 目的 基础说明 开发准备 设备树 应用程序 应用程序与演示 代码 演示 总结 设备树文件 目的 串口 UART 是嵌入式设备中比较常用的功能 这篇文章将记录下应用程序中串口操作相关内容 这篇文章中内容均在下面的开发板上进行测试 新
  • Dockerfile部署lnmp

    Dockerfile部署lnmp 实验步骤 需一台安装好docker的虚拟机 systemctl stop firewalld systemctl disable firewalld setenforce 0 指定网段 docker net
  • stream与Byte相互转换

    stream 转为byte public byte stream2byte Stream stream byte buffer new byte stream length stream Read buffer 0 buffer lengt
  • 嵌入式调试工具合集

    Embedded Develop Tools 嵌入式开发中用到的一些工具软件集 文章目录 Embedded Develop Tools 串口调试 串口收发 串口终端 虚拟串口 串口监控 网络调试 网络抓包 TCP UDP HTTP MQTT
  • Android SDK 安装与Manager下载tools详情

    Android SDK 安装与Manager下载tools详情 Android SDK 安装 前往android网站下载 下载图片红色处即可 下载后双击按步骤安装即可 Manager tools安装 进入安装的文件目录 找到SDK Mana
  • 区块链的5个特征

    id BSN 2021 公众号 BSN研习社 人们看重区块链 最重要的是看重区块链所具有的不可替代的功能和特点 这些特点包括去中心化 开放性 独立性 安全性 匿名性 去中心化 区块链技术不依赖额外的第三方管理机构或硬件设施 没有中心管制 除
  • Linux资源监控工具

    概述 glances 是一款用于 Linux BSD 的开源命令行系统监视工具 它使用 Python 语言开发 能够监视 CPU 负载 内存 磁盘 I O 网络流量 网速 文件系统 系统温度等信息 本文介绍 glances 的使用方法和技巧
  • 类注释文档编写方法

    对于Java语言 最体贴的一项设计就是它并没有打算让人们为了写程序而写程序 人们也需要考虑程序的文档化问题 对于程序的文档化 最大的问题莫过于对文档的维护 若文档与代码分离 那么每次改变代码后都要改变文档 这无疑会变成相当麻烦的一件事情 解
  • 大数据Java基础第十九天作业

    第一题 简单的URL获取资源下载 import java net URL import java net URLConnection import java io InputStream import java io FileOutputS
  • arm64 linux pgd_offset_k 代码阅读过程中的疑问记录

    start kernel gt setup arch gt early fixmap init gt pgd offset k pgd t pgd unsigned long addr FIXADDR START 0xffff7ffffab
  • 二维背包(包含优化)

    二维背包 二维背包 二维背包相较于01背包 多了一个限制 就是背包的重量有了限制 但是其本质和01背包并没有什么区别 只是多遍历一轮 f i j k 状态表示 解锁了前i个物品 背包可以承载体积为j 可以承重为w 状态转移方程 f i j