01背包(acwing闫氏DP分析法)

题目描述:

有 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

 分析步骤:

  第一:对于背包问题我们可以分为状态表示,和状态计算。我们如何去表示我们要求出的集合答案是我们背包问题最关键的问题,我们所有的表达式都要围绕这一条语句去构建。

  • 状态表示:我们定义集合为:对于所有前 i 个物体且总体积不超过 j 的选法的集合!!!取其中的最大值!!

  • 状态计算:由于所有的物品我们只有选与不选的问题所以我们将其分为两种类型来计算一种是:所有不选第i个物品的方案;第二种是:所有选择第 i 个物品的集合。只要把这两种状态去计算就可以完全包括所有的方案因为只有选与不选,选了的话就在第一种情况,不选就在第二种情况,不会存在薛定谔的选择:既选了又没选这是不可能的。

  • 状态计算的第一种情况(不选第i种的方案)我们仔细想想如果你不选这个物品的话,其实你现在的状态和dp[i-1][j]的情况是一样的,因为前面的方案也是没选第i种,而背包体积是不变的所以我们表达式就应该是   ans[i][j] = ans[i-1][j];

  • 状态计算的第二种情况(选择第i种方案)我们仔细想向如果我们选择这种物品的话前面(1~i-1)的情况是已经确定好了的是确定不变了的唯一有所改变的就是你现在要选的这个第i个物品。所以总结一下:那部分不变的是你在(1,i-1)的物品范围内,背包体积在(0,j-vi)的情况下所能得到的最大值,也就是dp(i-1,j-v[i]);那部分变化的就是你要选择的所以应该在不变的情况下加上w[i]就可以。然后去一下两种情况的最大值就可以了。

  • 注意一下,我们状态划分是分为两种状态,但是可能第二种情况不会存在,因为有可能背包装不下第i种物品。

  • 01背包从后往前,完全背包从前往后!!!

  第二:书写主函数,构建整体框架:

  • 书写背包问题的代码时候,我们一定要记得我们的集合定义,一切的一切都是围绕着一句话来展开的。

  • 用两个for i 代表物品,j代表背包体积。j可以从0开始,因为根据我们的定义:对于所有前 i 个物体且总体积不超过 j 的选法的集合!!!取其中的最大值!!总体积可以为0,因为我们可以不选择物品放入我们的背包。所体积可以是0。

  • 如果是不选择物品的话那么情况就和之前(1,i-1)的情况一致

  • 如果是选择物品还要判断一下我们背包是否可以放入物品,体积大过了物品的体积就可以放入则我们的答案就应该在前一部分不动的里面取出最大值再加上物品i的价值,和不选的方案取最大值。

for(int i = 1 ; i <= n ; i ++){for(int j = 0 ; j <= m ; j ++){ans[i][j] = ans[i-1][j];if(j >= v[i]){ans[i][j] = max(ans[i][j] , ans[i-1][j-v[i]] + w[i]);}}}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1010;int n , m ;
int v[N] , w[N];
int ans[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 ++){ans[i][j] = ans[i-1][j];if(j >= v[i]){ans[i][j] = max(ans[i][j] , ans[i-1][j-v[i]] + w[i]);}}}cout<<ans[n][m];return 0 ; 
}

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

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

相关文章

MATLAB:微分方程(组)数值解

一、显式微分方程 clc,clear tspan [0:10]; y0 2; [t1,y1] ode23(odefun_1,tspan,y0); %求数值解&#xff0c;精度相对低 [t2,y2] ode113(odefun_1,tspan,y0); %求数值解&#xff0c;精度相对高 yt sqrt(tspan1)1; %求精确解 subplot(1,2,1) plot(t1,y1,bo,t2,y2,r*,tspa…

C语言:动态内存管理(malloc,calloc,realloc,free)

目录 前言 malloc函数 free函数 calloc函数 realloc函数 前言 在这一章节将讲解动态内存分配&#xff0c;它可以在程序的堆区创建一块内存&#xff0c;在这块内存中存什么值就是由自己决定的了 开辟的空间有两个特点&#xff1a; 1. 空间开辟的大小是固定的 2. 数组在…

视频 | 轨迹模型及其它潜变量模型理论与实践

2024年3月20日&#xff0c;郑老师开办了“春分”临床统计学沙龙&#xff0c;本期沙龙和诸位分享了轨迹增长模型&#xff0c;以及其它潜变量模型包括潜类别模型和潜剖面模型的详细介绍和文献解读&#xff0c;R语言代码实践也有分享&#xff01; 非常感谢各位朋友在忙碌的工作生活…

线性数据结构----(数组,链表,栈,队列,哈希表)

线性数据结构 数组链表栈使用场景 队列应用场景 哈希表特点哈希函数&#xff0c;哈希值&#xff0c;哈希冲突键值对 Entry 开放寻址法和拉链法 参考文档 数组 数组(Array) 是一种很常见的数据结构。由相同类型的元素组成&#xff0c;并且是使用一块连续的内存来存储的。 在数组…

安装redis时候修改过的配置文件

只要是石头&#xff0c;到哪里都不会发光的 bind 绑定主机某个网卡对应的IP地址&#xff0c;如果某个主机有两个网卡A和B&#xff0c;那么绑定了A&#xff0c;通过B连接就会无法访问protected-mode 保护模式 Yes为只能本地访问port 启动的端口号pidfile pid存放的位置&#xff…

python django实战开发序列化器的一个应用心得分享

需求: 查询的时候返回不包括SharePasswd 字段, 但是新增操作需要用到该字段 再不写多个model模型和序列化器的前提下实现 如果您在查询&#xff08;GET 请求&#xff09;时不希望返回 SharePasswd 字段&#xff0c;但在新增&#xff08;POST 请求&#xff09;时需要用到该字段…

Python3爬取2023省市区

爬取地址https://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2023/ import re import requests import pandas as pd import warnings warnings.filterwarnings("ignore") import time from lxml import etree import pymysql t ,urls ,names [],[],[] INDEX_URL &…

Java两地经纬度通过高德api获取两地距离(公里)

代码如下&#xff1a; String startLongitude entity.getLONGITUDE(); // 起点&#xff08;当前位置&#xff09;经度String startLatitude entity.getLATITUDE(); // 起点纬度String endLongitude entity.getLO(); // 终点经度String endLatitude entity.getLA(); …

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解&#xff0c;并且每个知识点基本都会有例子演示&#xff0c;详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前&#xff0c;我们要先知道spring框架在开发时&#xff0c;服务器端采用三层架构的方…

电子元器件批发采购的数字化转型与技术应用

电子元器件批发采购的数字化转型和技术应用是提高效率、优化供应链管理以及增强竞争力的关键。以下是一些数字化转型和技术应用的方面&#xff1a; 电子商务平台&#xff1a;建立并优化电子商务平台&#xff0c;提供在线采购功能&#xff0c;使客户能够方便地浏览产品、下订单、…

ABNDP: Co-optimizing Data Access and Load Balance in Near-Data Processing——论文泛读

ASPLOS 2023 Paper 论文阅读笔记整理 问题 近数据处理&#xff08;NDP&#xff09;是一种很有前途的体系结构范式&#xff0c;可以解决数据密集型应用程序的内存墙挑战。基于3D堆叠存储器的典型NDP系统包含大量并行处理单元&#xff0c;每个并行处理单元都可以访问其本地存储…

HTML基础:8个常见表单元素的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具&#xff0c;持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…

​深入理解JMeter性能测试日志:分析并发用户行为与吞吐量指标

在进行软件性能测试时&#xff0c;使用Apache JMeter等工具能够生成详尽的测试报告和日志。这些数据对于评估应用程序的性能至关重要。本文将针对JMeter生成的压测日志数据进行详细解析&#xff0c;并解释特定字段的意义。 日志数据摘要&#xff1a; 以下是整个JMeter压测日志…

2024智能EDM邮件营销系统使用攻略

在数字化营销领域&#xff0c;智能EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销作为一种高效、精准的推广方式&#xff0c;正日益受到企业的高度重视。而要实现这一策略的成功落地&#xff0c;一个高可靠性和高稳定性的专业邮件发送平台则是不可或缺的关键环节。…

前后端实时数据通信

实现前后端实时数据转换通常涉及到以下几个步骤&#xff1a; 后端提供数据转换接口。 前端实时数据获取。 前端实时数据转换。 前端实时展示转换后数据。 以下是一个简单的例子&#xff0c;假设后端提供了一个接口来转换某种数据格式&#xff0c;前端使用JavaScript和WebS…

大数据分析案例-基于决策树算法构建大学毕业生薪资预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 &#xff1a;喂&#xff0c;你的页面白啦&#xff01; 出现上线白屏的问题有很多&#xff0c;如&#xff1a;配置错误、缓存问题、浏览器兼容问题&#xff0c;根据不同情况去解决。 路由配置问题 问题描述&#xff1a; 在vue开发…

C语言中位运算介绍

在C语言中&#xff0c;位运算是一种对二进制位进行操作的运算方式&#xff0c;它可以对数据的二进制表示进行位级别的操作&#xff0c;包括按位与、按位或、按位异或、按位取反等。位运算常用于处理底层数据结构、优化代码性能以及实现各种算法。本文将深入介绍C语言中的位运算…

两区域二次调频风火机组,麻雀启发式算法改进simulink与matlab联合

区域1结果 区域2结果 红色曲线为优化后结果〔风火机组二次调频〕

软件杯 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…