【算法】背包问题——01背包

题目

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,N,V用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi 用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0 < N , V ≤ 1000
0 < vi , wi ≤ 1000

思路

两层循环:

        外层:循环遍历每一个物品

        内层:在当前物品放入背包中,求出在背包有不同容量时装入物品的最大值。 

手动模拟

注意:在背包容量为0,或者没有物品的时候,背包内物品的最大价值为0;

遍历第1个物品:

        背包容积为1的时候:可以将该物品1放入,总价值为2。

        背包容积为2的时候:可以将该物品1放入,总价值为2。

        背包容积为3的时候:可以将该物品1放入,总价值为2。

        背包容积为4的时候:可以将该物品1放入,总价值为2。

        背包容积为5的时候:可以将该物品1放入,总价值为2。

遍历第2个物品:

        背包容积为1的时候:可以将该物品1放入,总价值为2。

        背包容积为2的时候:可以将该物品2放入,总价值为4。

        背包容积为3的时候:可以将该物品1、2放入,总价值为6。

        背包容积为4的时候:可以将该物品1、2放入,总价值为6。

        背包容积为5的时候:可以将该物品1、2放入,总价值为6。

遍历第3个物品:

        背包容积为1的时候:可以将该物品1放入,总价值为2。

        背包容积为2的时候:可以将该物品2放入,总价值为4。

        背包容积为3的时候:可以将该物品1、2放入,总价值为6。

        背包容积为4的时候:可以将该物品1、2放入,总价值为6。

        背包容积为5的时候:可以将该物品1、2、3放入,总价值为8。

遍历第4个物品:

        背包容积为1的时候:可以将该物品1放入,总价值为2。

        背包容积为2的时候:可以将该物品2放入,总价值为4。

        背包容积为3的时候:可以将该物品1、2放入,总价值为6。

        背包容积为4的时候:可以将该物品1、2放入,总价值为6。

        背包容积为5的时候:可以将该物品1、2、3放入,总价值为8。

可以得出:

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

代码1

//二维数组版
#include<bits/stdc++.h>
using namespace std;const int N = 1010;
int n,m;// 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 ++)// 容量循环{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;
}

优化

        通过手动模拟,我们可以发现,不需要二维数组就可以存储数据,为了数据防止被覆盖,内层循环需要从m依次循环到v[ i ];

状态转移方程:

f[ j ] = max( f[ j ],f[ j - v[ i ] ] + w[ i ]);

代码2

// 优化为一维数组版
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,m;// n代表物品个数,m代表背包容量
int v[N],w[N],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 = m; j >= v[i]; j --)// 容量循环f[j] = max(f[j],f[j - v[i]] + w[i]);cout << f[m] << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP/HTTPS、SSL/TLS、WS/WSS 都是什么?

有同学问我&#xff0c;HTTP/HTTPS、SSL/TLS、WS/WSS 这都是些什么&#xff1f;那我们就先从概念说起&#xff1a; HTTP 是超文本传输协议&#xff0c;信息是通过明文传输。HTTPS 是在 HTTP 的基础上信息通过加密后再传输。SSL 是实现 HTTPS 信息传输加密的算法。TLS 是 SSL 的…

Redis学习系统(持续更新中)

RedisExample 课程介绍 目标是提供一个高效、可靠的学习和实践Redis的环境。我们将通过搭建Redis集群、实现缓存数据的持久化存储、制定缓存数据的淘汰策略以及同步缓存数据等步骤来深入了解和学习Redis的特性和功能。通过这个项目&#xff0c;你可以掌握Redis的核心概念和技…

可视化协作软件有哪些?这10款神器助力团队合作!

可视化协作已经成为一个时下热门词汇&#xff0c;问题是对其并没有一个清晰的定义。有人认为它代表了一个云端环境&#xff0c;具有能够使办公室、混合办公和远程员工一起工作的功能。其他人则认为可视化协作不过是数字化白板而已。 随着这个术语变得更加流行&#xff0c;许多…

算法通关村第五关-白银挑战队列经典问题

大家好我是苏麟 , 今天带来几道经典小题 . 大纲 两数之和 两数之和 相信大家对这道题还是很眼熟的 , 打开LeetCode第一道题就是它 , 对它可真的又爱又恨 , 很多新手朋友们想刷LeetCode但又不知道从哪开始就打开了第一题 , 结果就对算法失去了信心 . 这道题找对方法还是很容易…

OpenShift - 利用容器的特权配置实现对OpenShift攻击

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.13 的环境中验证 本文是《容器安全 - 利用容器的特权配置实现对Kubernetes攻击》的后续篇&#xff0c;来介绍 在 OpenShift 环境中的容器特权配置和攻击过程和 Kubernetes 环境的差异。 文…

macOS 安装brew

参考链接&#xff1a; https://mirrors4.tuna.tsinghua.edu.cn/help/homebrew/ https://www.yii666.com/blog/429332.html 安装中科大源的&#xff1a; https://zhuanlan.zhihu.com/p/470873649

cplex基础入门(三)之运行调试debug

聊聊题外话&#xff0c;你用cplex进行代码编写&#xff0c;其实你也可以相当于在编程一样&#xff0c;那对于编程&#xff0c;有一项非常核心的能力就是代码调试以及debug的能力&#xff0c;那你运行以及编写cplex也是一样&#xff0c;同样需要你会使用调试的方式&#xff0c;来…

前端学习之webpack的使用

概述 webpack是一个流行的前端项目构建工具&#xff08;打包工具&#xff09;&#xff0c;可以解决当前web开发中所面临的问题。 webpack提供了友好的模块化支持&#xff0c;以及代码压缩混淆、处理js兼容问题、性能优化等强大的功能&#xff0c;从而让程序员把工作重心放到具…

mysql---索引

概要 索引&#xff1a;排序的列表&#xff0c;列表当中存储的是索引的值和包含这个值的数据所在的行的物理地址 作用&#xff1a;加快查找速度 注&#xff1a;索引要在创建表时尽量创建完全&#xff0c;后期添加影响变动大。 索引也需要占用磁盘空间&#xff0c;innodb表数据…

常用的Linux远程桌面配置方法

TigerVNC 是 VNC&#xff08;虚拟网络计算&#xff09;的高性能、平台中立的实现&#xff0c;VNC 是一种客户端/服务器应用程序&#xff0c;允许用户在远程计算机上启动图形应用程序并与之交互。 TigerVNC 提供运行 3D 和视频应用程序所需的性能水平&#xff0c;并尝试在其支持…

【MongoDB】Windows 安装MongoDB 6.0

一、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 二、解压并安装 1、解压 这里我将压缩包解压到了D盘&#xff0c;并重命名成了mongodb&#xff0c;解压后的目录如下&#xff1a; 2、创建配置文件 在D:\mongodb下新建conf目录…

Jetpack Compose 中下拉框实现

下拉菜单主要 以下三种实现&#xff1a; ExperimentalMaterialApi Composable fun ExposedDropdownMenuBox(expanded: Boolean,onExpandedChange: (Boolean) -> Unit,modifier: Modifier Modifier,content: Composable ExposedDropdownMenuBoxScope.() -> Unit )实现代…

5G及其后的5G非地面网络:趋势和研究挑战-HARQ部分

NTN组件纳入5G架构第一步 在NTN SI中定义了一组架构选项。就NT部分而言&#xff0c;已确定了两大类&#xff1a;星载&#xff08;即基于卫星的通信平台&#xff09;和机载&#xff08;即HAPS&#xff09;设备 并行管理HARQ最大进程数 NHARQRTT(NTX−1)2μ NTX&#xff1a;传输…

段错误如何调试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言段错误产生的原因问题1&#xff1a;访问不存在的内存地址问题2&#xff1a;访问只读的内存地址问题3&#xff1a;栈溢出问题4&#xff1a;内存越界如何解决段错…

虹科示波器 | 汽车免拆检修 | 2013款大众途观车发动机加速无力

一、故障现象 一辆2013款大众途观车&#xff0c;搭载CGM发动机&#xff0c;累计行驶里程约为12.6万km。车主进厂反映&#xff0c;发动机加速无力。 二、故障诊断 接车后试车&#xff0c;发动机怠速运转正常&#xff1b;原地将加速踏板踩到底&#xff0c;发动机转速最高只能达到…

专为个人打造专注工作的便签APP工具推荐哪个

工作中很多人都比较懒散&#xff0c;工作起来动力不足&#xff0c;常常拖延消极怠工&#xff0c;等到一天结束后进行工作盘点时才发现很多项任务都没有处理完&#xff1b;这和日常工作不能专注于工作有很大的关系。 专注工作&#xff0c;在日常办公时可以选择一些好用的手机便…

JsonPath 数据快速查找和提取工具

常用语法 表达式说明$表示根元素$.key选择根元素下的指定键名的值$.*选择根元素下的所有属性值$.array[*]选择根元素中的数组的所有元素$.key[subkey]选择根元素中的键名为key&#xff0c;子键名为subkey的值$.key[*].subkey选择根元素中的键名为key的所有元素的子键名为subke…

【深度学习项目从下载到运行】

本文只是介绍一个大致的流程&#xff0c;简单的介绍一个深度学习项目整体的一个从下载到运行的框架让初学者入门。 实际在运行的过程中可能会遇到各种各样的问题。 目录 代码下载python项目各个文件夹的解释一个深度学习项目要包含的各个模块配置环境命令行运行项目且看项目的参…

将 UniLinks 与 Flutter 集成(安卓 AppLinks + iOS UniversalLinks)

让我们使用 Flutter Mobile 和 Flutter Web 集成 UniLinks。 一步一步的指导&#xff01; 我是 Pedro Dionsio&#xff0c;是葡萄牙 InspireIT 公司的 Flutter 开发人员&#xff0c;我写这个 UniLinks 教程的座右铭是&#xff1a; Firebase DynamicLinks 已被弃用&#xff0…

Goland 对容器中的 Go 程序断点远程调试

1&#xff0c;针对 golang 程序打断点有哪几种情况 临时进程&#xff1a;针对临时运行一次的 Golang 脚本&#xff0c;比如定时统计脚本&#xff0c;定时推送脚本。常驻进程&#xff1a;针对一直在后台运行的 Golang 程序&#xff0c;比如 HTTP 或者 GRPC 服务。 我们现在假设…