AcWing 3. 完全背包问题 学习笔记

有 N� 种物品和一个容量是 V� 的背包,每种物品都有无限件可用。

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

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

输入格式

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

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

输出格式

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

数据范围

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

输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10
难度:简单
时/空限制:1s / 64MB
总通过数:140737
总尝试数:253360
来源:背包九讲 , 模板题
算法标签

挑战模式

#include<bits/stdc++.h>
using namespace std;const int N=1010;
int v[N],w[N];
int f[N];int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)   scanf("%d%d",&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]);printf("%d\n",f[m]);return 0;
}

完全背包问题是这样的:给定一个容量为m的背包,可以选择的物品有n件,每一件物品的体积是vi,每一件物品的价值是wi,我们要让背包所装的物品的总价值最大, 求这个最大的价值是多少

这个问题的独特之处在于,不超过背包容量的情况下,某一件特定的商品可以选择无数次。

公式可以经过数学推导出来,看起来非常简单的代码,其实要经过挺长的推导

for(int i=0;i<n;i++)for(int j=v[i];j<=m;j++)f[j]=max(f[j],f[j-v[i]]+w[i]);

数学推导如下:

我们有n件物品,对于某一件物品i进行考虑,在不超过背包容量j的情况下,物品i可以选择0件,1件,2件……k件……f[i][j]表示的是选择i件物品,背包容量为j的情况下能装的最大的价值。所以还是让i从1开始计数方便描述一些,下面贴一份代码

#include<bits/stdc++.h>
using namespace std;const int N=1010;
int v[N],w[N];
int f[N][N];int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)   scanf("%d%d",&v[i],&w[i]);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){f[i][j]=f[i-1][j];if(j>=v[i]) f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);}}printf("%d\n",f[n][m]);return 0;
}

f[i][j]=f[i-1][j];

这一行表示的是,不选第i件物品,那么最大值就是f[i-1][j],我们不需要考虑这个数字的具体数值是多少,属于是一种递推的思路

 

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

如果背包足够放下第i件物品,好像改成这样也可以过

 

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

 

接下来考虑的问题是,能不能把二维的答案数组优化为一维的答案数组,发现把循环范围改成从v[i]开始,可以直接把第一维去除,代码的含义没有发生改变,(这里其实不太懂,f[i][j-v[i]]和f[i-1][j]为啥一样可以直接去掉第一维呢) 

 

 

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

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

相关文章

iOS_折叠展开 FoldTextView

1. 显示效果 Test1&#xff1a;直接使用&#xff1a; Test2&#xff1a;在 cell 里使用&#xff1a; 2. 使用 2.1 直接使用 // 1.1 init view private lazy var mooFoldTextView: MOOFoldTextView {let view MOOFoldTextView(frame: .zero)view.backgroundColor .cyanvie…

模块化Common JS 和 ES Module

目录 历程 1.几个函数&#xff1a;全局变量的污染&#xff0c;模块间没有联系 2.对象&#xff1a;暴露成员&#xff0c;外部可修改 3.立即执行函数&#xff1a;闭包实现模块私有作用域 common JS module和Module 过程 模块依赖&#xff1a;深度优先遍历、父 -> 子 -…

Python基础:错误和异常

在Python中的错误可&#xff08;至少&#xff09;被分为两种&#xff1a;语法错误和 异常&#xff0c;均是指在程序中发生的问题和意外情况。Python提供了异常处理机制&#xff0c;使程序能够更容易地应对这些问题。 1. 语法错误&#xff08;Syntax Error&#xff09; 语法错误…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

ubuntu20.04在docker下运行ros-noetic进行开发

经常折腾虚拟机各双系统 &#xff0c; 想着不如把docker利用起来&#xff0c;下面算是一个初学者使用docker运行ros的记录&#xff1a; 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

命令执行相关函数及各类命令执行绕过技巧

相关函数 &#xff08;命令注入&#xff09; 命令执行的绕过

【LeetCode刷题日志】232.用栈实现队列

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;LeetCode 刷题日志&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;…

公网访问全能知识库工具AFFINE,Notion的免费开源替代

文章目录 公网访问全能知识库工具AFFINE&#xff0c;Notion的免费开源替代品前言1. 使用Docker安装AFFINE2. 安装cpolar内网穿透工具3. 配置AFFINE公网访问地址4. 实现公网远程访问AFFINE 公网访问全能知识库工具AFFINE&#xff0c;Notion的免费开源替代品 前言 AFFiNE 是一个…

穷举法、回溯法、分支界限法解决旅行商(TSP)问题

文章目录 一、问题描述二、穷举法解决2.1 介绍2.2 代码 三、回溯法解决四、分支界限法4.1 介绍4.2 代码 一、问题描述 有一个旅行商由某城市出发&#xff0c;经过所有给定的 n n n 个城市后&#xff0c;再回到出发的城市。除了出发的城市外&#xff0c;其它城市只经过一回。这…

RepVgg: 网络结构重参化

CVPR2021 截至目前1004引 论文连接 代码连接 文章提出的问题 大多数的研究者追求的是设计一个好的网络结构,这种“好”体现在网络具有复杂的网络设计,这种网络虽然比简单的网络收获了更加高的准确率,但是网络结构中的大量并行分支,导致模型的难以应用和自定义,主要体现…

【神印王座】月夜大尺度诱惑,皓晨潜入月魔宫,枫秀降临男扮女装

Hello,小伙伴们&#xff0c;我是拾荒君。 为了能安全回到联盟&#xff0c;龙皓晨决定让月夜商队护送他们&#xff0c;这也是他们目前处境更快更安全回到人类境地的方法。于是&#xff0c;龙皓晨只身一人去寻找月夜&#xff0c;此次执行的任务完全超出龙皓晨的掌握之外&#xf…

Docker中快速安装RabbitMQ

文章目录 前言一、安装Docker二、安装RabbitMQ无脑命令行运行 总结 前言 在Ubuntu中的Docker容器中快速安装RabbitMQ&#xff0c;亲测有效&#xff0c;不废话&#xff0c;上操作。 一、安装Docker 直接按照Docker官方教程操作&#xff1a;官方安装教程 点进官网&#xff0c;往…