【算法】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,一经查实,立即删除!

相关文章

面经(七)南京先维

总体评价&#xff1a; 哈哈&#xff0c;感觉又没了前半段发挥还挺好&#xff0c;但到了后面&#xff0c;听录屏的声音&#xff0c;越来越底气不足&#xff0c;回答也是极尽含糊虽然问的问题不难&#xff0c;都是基础知识&#xff0c;但关键是&#xff0c;只会单纯地用&#xf…

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

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

【BlossomConfig】配置中心Core核心功能代码的编写

文章目录 Core什么是配置中心&#xff1f;以及如何实现一个配置中心&#xff1f;SpringBoot如何实现配置的管控&#xff1f;SpringCloud项目是如何对bootstrap配置文件进行加载的&#xff1f;Nacos是如何实现配置文件的读取加载的&#xff1f;开发配置中心前必须了解的前置知识…

关于 MySQL 优化(详解)

文章目录 关于 MySQL 优化一、硬件方面的优化1、关于 CPU2、关于内存3、关于磁盘 二、MySQL 配置文件1、 default-time-zone8:002、interactive_timeout 1203、wait_timeout 1204、open_files_limit 102405、group_concat_max_len 1024006、usermysql7、character-set-serv…

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

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

Web软件测试面试总结

整理下最近遇到的Web软件测试会被问到的问题&#xff0c;来自测下你掌握得怎么样&#xff1f; 一、编程语言相关 1、字符串反转 s "I am Donny" reversed_s s[::-1] print(reversed_s)这将输出 “ynnoD ma I”。 2、基础数据类型 基本数据类型&#xff08;Prim…

三步提升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"…

深度学习训练中的种子设置

文章目录 深度学习训练中的种子设置1. 为什么需要设置随机种子2. 随机种子的设置及使用 深度学习训练中的种子设置 1. 为什么需要设置随机种子 在神经网络训练过程中&#xff0c;经常会通过随机的方式对一些数据进行初始化&#xff1a; 1、随机权重&#xff0c;网络有些部分…

C语言--实现判断输入数字是几位数的函数

用起来很方便&#xff0c;代码如下 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int digit (int x){int count 0;do {count;x x / 10;} while (x > 0); return count;} int main() {int x 0;scanf("%d", &x);int number digit(x);printf…

如何在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;或者有补充的…

【软件测试】教程及案例

软件测试是软件开发过程中的关键环节&#xff0c;它确保软件产品符合设计要求并且能够在各种条件下正常运行。以下是关于软件测试的教程和案例的详细介绍&#xff1a; ### 软件测试基础 软件测试的目的是发现和修复软件中的缺陷&#xff0c;以确保软件的质量。测试可以在软件…

面试题(六)

目录 101.RocketMQ的事务消息是如何实现的 102.为什么RocketMQ不使⽤Zookeeper作为注册中⼼呢&#xff1f; 103.RocketMQ的实现原理 104.RocketMQ为什么速度快 105.消息队列如何保证消息可靠传输 106.消息队列有哪些作⽤ 107.死信队列是什么&#xff1f;延时队列是什么&a…

【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 不查询数据库&…

Pytorch:Pytorch入门基础

文章目录 一、PyTorch概述二、Pytorch基础数据结构三、Tensorflow和Pytorch的区别TensorFlow和PyTorch的区别 四、导入Pytorch库 学习参考于&#xff1a; 与凤行——上古神君&#xff1a;Pytorch数据结构 一、PyTorch概述 PyTorch是一个开源的机器学习库&#xff0c;用于计算…

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

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