【算法】01背包问题(代码+详解+练习题)

题目:

有 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

输出样例:

8

算法分析:

以上面的题目为例:

f[i][j] : j是已经选择过后的背包的体积;

如果没有放入,背包的体积没有变化,即前一个前i-1个物品的体积也是j;
如果放入j前i-1的体积不同,j是前i-1个物品的体积改变而来的,即j-v[i]前i-1个物品总体积;

如果还是不能理解的话,可以代入数据来写一下:

最后的f[4][5]就是最大价值;

代码:

#include<iostream>
#include<math.h>
using namespace std;
const int N = 1e4;
int v[N], w[N];
int f[N][N];int main()
{int n, m;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++){if (j < v[i])f[i][j] = f[i - 1][j];elsef[i][j]= max( f[i - 1][j],f[i - 1][j - v[i]] + w[i] );}}cout << f[n][m] << endl;
}

优化:

上面的代码我们用到是二维数组,如果数据较大,空间也会较大;怎么优化呢?

根据我们上面的分析,我们要求的 i ,只和 i-1 有关,所以我们只需要保存 i-1 的数据即可;

代码如下:

#include<iostream>
#include<math.h>
#include<cstring>
using namespace std;
const int N = 1e4;
int v[N], w[N];
int f[N],g[N];int main()
{int n, m;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++){if (j < v[i])g[j] = f[j];elseg[j]= max( f[j],f[j - v[i]] + w[i] );}memcpy(f, g, sizeof(g));}cout << f[m] << endl;
}

我们只需修改一下代码即可: 

 for (int j = 0; j <= m; j++)
        {
            if (j < v[i])
                g[j] = f[j];
            else
                g[j]= max( f[j],f[j - v[i]] + w[i] );
        }
        memcpy(f, g, sizeof(g));

f[j] 前i-1 个物品的总体积;

g[j] 前i 给物品的总体积;

我们只需要把g[j]求出来,然后更新f[j]即可;

不理解的话可以看一下模拟过程:

 

再次优化:

上面的优化过程我们用了g[N]的数组;

如何只用一个f[N]的数组来写?

只需要改变一下代码:

for (int j = m; j>=v[i]; j--)
        {
            f[j] = max(f[j], f[j - v[i]] + w[i]);
        }

#include<iostream>
#include<math.h>
using namespace std;
const int N = 1e4;
int v[N], w[N];
int f[N];int main()
{int n, m;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;
}

练习:

题目:

 [NOIP2006 普及组] 开心的金明 - 洛谷

 [NOIP2005 普及组] 采药 - 洛谷

 AC代码:

(1)

#include<iostream>
#include<math.h>
using namespace std;
int f[100004],v[100000], p[100000];int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= m; i++)cin >> v[i] >> p[i];for (int i = 1; i <= m; i++){int t = 0;for (int j = n; j >= v[i]; j--){f[j] = max(f[j], f[j - v[i]] + p[i]*v[i]);}}cout << f[n] << endl;
}

(2)

#include<iostream>
#include<math.h>
using namespace std;
int f[1004], T[1000], W[1000];
int main()
{int t, m;cin >> t >> m;for (int i = 1; i <= m; i++)cin >> T[i] >> W[i];for (int i = 1; i <= m; i++){for (int j = t; j >= T[i]; j--){f[j] = max(f[j], f[j - T[i]] + W[i]);}}cout << f[t] << endl;
}

完结!

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

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

相关文章

视频素材库有哪些网站?八大平台视频素材库创作推荐

视频创作的小达人们&#xff0c;是不是经常在想&#xff0c;视频素材库有哪些网站能提供高质量的素材呢&#xff1f;别担心&#xff0c;今天我要为你们揭秘八个超棒的视频素材网站&#xff0c;让你的视频制作更加轻松在创作的路上如鱼得水&#xff01; 蛙学网&#xff1a;海量…

深入探索Yarn:安装与使用指南

Yarn 是一个由 Facebook 开发的 JavaScript 包管理器&#xff0c;旨在提供更快、更可靠的包管理体验。它与 npm 类似&#xff0c;但在某些方面更加高效和可靠。本文将介绍如何安装 Yarn&#xff0c;并展示如何使用它来管理 JavaScript 项目的依赖。 1. 安装 Yarn Yarn 可以通…

三步提升IEDA下载速度——修改IDEA中镜像地址

找到IDEA的本地安装地址 D:\tool\IntelliJ IDEA 2022.2.4\plugins\maven\lib\maven3\conf 搜索阿里云maven仓库 复制https://developer.aliyun.com/mvn/guide中红框部分代码 这里也是一样的&#xff1a; <mirror><id>aliyunmaven</id><mirrorOf>*&…

【c++初阶】类与对象(下)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

ESP32学习---ESP-NOW

ESP32学习---ESP-NOW 基于Arduino IDE环境获取mac地址单播通讯一对多通讯多对一通讯多对多通讯模块1代码模块2模块3 广播通讯 基于ESP-IDF框架 乐鑫编程指南中关于ESP-NOW的介绍&#xff1a;https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.1/esp32/api-reference/net…

7.1 Mysql shell 定时备份

直接上脚本----linu 定时任务执行 #!/bin/bash# 配置信息 DB_USER"your_username" # 数据库用户名 DB_PASSWORD"your_password" # 数据库密码 DB_NAME"your_database_name" # 要备份的数据库名 BACKUP_DIR"/path/to/backup/directory"…

如何在Ubuntu系统部署Z-blog博客结合cpolar实现无公网IP访问本地网站

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗 Mac玩游戏 crossover24免费激活

CrossOver是一款可以在macOS上运行Windows应用程序的软件&#xff0c;它利用了Wine技术&#xff0c;无需安装虚拟机或双系统&#xff0c;可以直接在苹果系统下运行Windows游戏。那么&#xff0c;使用CrossOver玩游戏会损害电脑吗&#xff1f;CrossOver玩游戏会卡吗&#xff1f;…

LLaMA-Factory参数的解答

打开LLaMA-Factory的web页面会有一堆参数 &#xff0c;但不知道怎么选&#xff0c;选哪个&#xff0c;这个文章详细解读一下&#xff0c;每个参数到底是什么含义这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数不对请反馈一下&#xff0c;或者有补充的…

【Entity Framework】EF中的增删改查

【Entity Framework】EF中的增删改查 文章目录 【Entity Framework】EF中的增删改查一、概述二、DbContext数据上下文三、EntityState五个状态值四、EF添加数据4.1 EF Add方式4.2 EF 通过改变对象的状态为 Added4.3 调用方sql4.4 调用存储过程 五、EF修改数据5.1 不查询数据库&…

项目管理系统在制造业的应用,提高生产效率的秘诀与解决方案

缩短产品交货周期&#xff0c;提高产品交付率是当下很多制造业面临的难题&#xff0c;项目管理系统业务流程自动化&#xff0c;能够显著改善项目效率。接下来我们说一说项目管理系统在制造业的应用&#xff0c;项目管理系统制造业解决方案。 制造业典型的项目背景 随着企业体量…

学习【Redis原理篇】这一篇就够了

目录 1. 数据结构1-1. 动态字符串&#xff08;SDS&#xff09;1-2. intset1-3. Dict 2. 网络模型3. 通信协议4. 内存策略 1. 数据结构 1-1. 动态字符串&#xff08;SDS&#xff09; 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字…

【Java项目】基于SpringBoot的【就业信息管理系统】

在当今这个科技迅猛发展的时代&#xff0c;计算机技术在生活中扮演着至关重要的角色&#xff0c;特别是在信息管理领域。在这样的背景下&#xff0c;学习计算机知识不只是简单地掌握一项技能&#xff0c;更关键的是将所学知识应用于实际&#xff0c;以创新的思维不断简化人们的…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。…

热门IT【视频教程】-华为/思科/红帽/oracle

华为认证 网络工程师-入门基础课&#xff1a;华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课&#xff1a;华为HCIP认证课程介绍-CSDN博客 职场进阶&#xff0c;踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 &#xff1a; 超级实用&#xff0c;华为VRP系统文件…

8.6 循环神经网络的简洁实现

每个步长共用参数 加载数据 虽然 8.5节 对了解循环神经网络的实现方式具有指导意义&#xff0c;但并不方便。 本节将展示如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from…

#include<初见C语言之指针(5)>

目录 一、sizeof和strlen的对比 1. sizeof 2.strlen 二、数组和指针题解析 1. ⼀维数组 1.1数组名理解 2.字符数组 3. ⼆维数组 三、指针运算题解析 总结 一、sizeof和strlen的对比 1. sizeof 我们前面介绍过sizeof是单目操作符 sizeof括号中有表达式&#xff0c;不…

解决PATH变量污染的问题

文章目录 解决PATH变量污染的问题概述笔记清空PATH变量之后的系统设置在命令行查看清空后的PATH变量以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例以系统命令 where为例run_vs2019.bat备注 - 批处理的后缀最好是batEND 解决PATH变量污染的问题 概述 随着不断安装新软件,…

一文彻底搞懂如何创建线程

文章目录 1. java创建线程(Thread)方式2. 继承 Thread 类3. 实现 Runnable 接口4. 实现 Callable 接口5. 使用线程池6. 使用匿名类 1. java创建线程(Thread)方式 方式一&#xff1a;继承于Thread类&#xff0c;这是最常见的创建线程的方式之一&#xff0c;通过继承 Thread 类并…

BeanDefinition

这里写目录标题 BeanDefinitionBeanDefinitionReaderAbstractBeanDefinitionReaderXmlBeanDefinitionReader BeanDefinition 上述Spring的基本运行中&#xff0c;你所有的定义描述信息都在XML文件里面&#xff0c;如何读取呢&#xff1f; 当然通过 new ClassPathXmlApplicatio…