01背包问题

news/2024/10/4 0:17:58

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

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

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

输入格式

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

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

输出格式

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

数据范围

0<N,V≤1000

0<vi,wi≤1000

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

题解:

每个物品都有两种情况, 选或者不选, 所以要从 2^n 中方案中找到最大值

f[i][j] 表示的是 只考虑前i个商品中, 体积不超过j的 最大价值
状态表示: 只考虑前i个商品中, 体积不超过j的价值
属性是: 最大值


状态计算:
对于每个f[i][j]都包含两个状态

  1. 不选第 i 个商品的最大价值 ---> f[i - 1][j]
  2. 选第 i 个商品的最大价值 ---> f[i - 1][j - v[i]] + w[i]

对这两个表达式 求一个max就是f[i][j], f[n][m]就是答案


ac代码 + 样例图解模拟 (横着的是 j, 竖着的是 i)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
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 ++){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]);} // 为什么当j>=v[i]的时候就可以装第i个物品了呢,j的意思是总体积不超过j,如果只是总体积大于v[i],但是背包剩余的体积小于v[i],肯定装不下v[i]啊
// 可能有同学有上面的疑惑, 这里解释一下, f[i][j]的状态计算的第二个 "选第 i 个商品的最大价值", 是只考虑存在 第 i 个商品, i前面的商品是否存在不考虑
// 比如下图紫色字体的位置。 如果 这里的判断条件是 背包剩余的体积不小于v[i], 那么 图中紫色数字应该是2, 因为 v[1] = 1, v[2] = 2, j = 2, 前两个商品的体积加起来大于j(2)。 
// 但如果判断条件是(j >= v[i]) 紫色数字就是4, 因为第二个商品的价值是4, 显然, f[2][2] = 4才是对的cout << f[n][m] << endl;return 0;
}

觉得写的不错的话, 点个赞吧~

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

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

相关文章

74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。 示例 1:输入:matrix = [[1,3,5,7],[10,11,16,20],[2…

Java容器化改造

docker java项目容器化改造 前后端分离项目 前端 https://gitee.com/yuco/eladmin-web.git 后端 https://gitee.com/yuco/eladmin.git要素:vue npm springboot mysql redisjava后端容器化 思路: 了解在物理机虚拟机的部署流程,然后编写dockerfile进行容器化部署。 java项目,…

基于深度卷积神经网络的时间序列图像分类,开源、低功耗、低成本的人工智能硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然大多数时间序列分类(TSC)文献都集中在1D信号上,但本文使用递归图(RP)将时间序列转换为2D纹理图…

C#中OCR的靠谱方式

https://www.cnblogs.com/xuexz/p/17905030.html 注意:使用SpireOCR时要取消目标平台【首选32位】的勾选,否则会报错。 C# using PaddleOCRSharp; using Spire.OCR;namespace WinFormsApp {public partial class Form1 : Form{public PaddleOCREngine engine;public Form1(){…

Selenium4自动化测试2--元素定位By.ID,By.CLASS_NAME,By.TAG_NAME

三、元素定位方式 1-通过id定位,By.ID id属性在HTML中是唯一的,因此使用id定位可以确保找到页面上唯一的元素。 由于id是唯一的,浏览器在查找元素时可以快速定位到目标元素,提高了定位的效率。 import time#pip install selenium from selenium import webdriver from sele…

hexo 博客插入本地图片时遇到的坑

哈喽大家好,我是咸鱼。 最近一直在折腾博客的事,说是 hexo 极易上手,我觉得只仅限于在安装部署的时候,随着对 hexo 的深入使用,发现遇到的问题还是挺多的。 那今天来讲一下我在把本地图片插入到 hexo 博客文章中遇到的坑。 遇到的问题 这是我的 hexo 环境: hexo: 7.2.0 n…

VectSharp一个C#轻量级矢量图形库

VectSharp 是一个功能强大的 C# 库,专门用于创建矢量图形,包括文本,不依赖任何第三方,支持跨平台运行,包括 Mac、Windows 和 Linux。使得开发者可以更容易地在他们的项目中集成矢量图形的生成和处理。https://github.com/arklumpus/VectSharp 特点:内置字体:包含了 14 种…