首页 > 其他分享 >背包问题学习笔记

背包问题学习笔记

时间:2024-03-29 21:12:53浏览次数:24  
标签:背包 int 笔记 学习 01 110 vv 物品

背包问题学习笔记

背包问题简介

hello,我是爱记笔记的doing。这次学习背包问题,特此记录。

关于背包问题的经典资料自然是著名的“背包九讲”,如果需要猛戳这里获取。

但是背包九讲对于我们蒟蒻来说实在不友好,只有伪代码,十分不方便,所以才有了这篇笔记。

首先我们需要了解——常见的背包问题类型有哪些?有什么区别?为了方便大家理解,可以看这幅图。

01背包和完全背包的区别

01背包

什么是01背包

01背包的原型就是指一个最大体积容量为V的背包,N个物品,第i个物品的体积是w[i],价值为v[i],求将物品装入背包最大的价值是多少。

理解01背包

这就是标准的01背包问题。那么如何理解它呢?我们首先思考:\(f[i]\)代表的是什么?在一般的01背包中,\(f[i]\)代表的是当背包大小为i时的最大价值。先看代码:

#include<iostream>
using namespace std;
int vv,n,w[110],v[110],f[10100];
int main(){
    cin >> vv >> n;
    for (int i = 1;i <= n;++i) cin >> w[i] >> v[i];
    for (int i = 1;i <= n;++i){
        for (int j = vv;j >= w[i];--j){ // 注意这里,是重点!
            f[j] = max(f[j],f[j - w[i]] + v[i]); // 状态转移方程
        }
    }
    cout << f[vv];
    return 0;
}

这时有人就会问了:为什么j要反着来?这要从01背包和完全背包说起。

01背包每个物品不可以选多次,假设容量是10,物品体积是2,如果正着来:

背包容量 选的个数
0 0
1 0
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
10 5

发现问题了吗?物品被选了多次!为什么呢?因为每次推算后边的都会根据前边的推算,如果计算完了\(f[2]\),那么计算\(f[4]\)时发现还可以装一个,那么数量就是1+1=2!所以,如果从后往前推算,计算到\(f[4]\)时,发现\(f[2]\)=0,每次状态转移方程只会将物品数量增加1,那么便可以实现每个物品只选一次!反之,如果将循环正过来,那就成了完全背包!

完全背包

上一段已经将01和完全背包代码的区别讲的很清楚了,那么这一段就直接贴代码:

#include<iostream>
using namespace std;
int vv,n,w[110],v[110],f[10100];
int main(){
    cin >> vv >> n;
    for (int i = 1;i <= n;++i) cin >> w[i] >> v[i];
    for (int i = 1;i <= n;++i){
        for (int j = w[i];j <= vv;++j){ // 注意这里,把循环正了过来
            f[j] = max(f[j],f[j - w[i]] + v[i]); // 状态转移方程
        }
    }
    cout << f[vv];
    return 0;
}

标签:背包,int,笔记,学习,01,110,vv,物品
From: https://www.cnblogs.com/doingfx/p/18104617

相关文章

  • 黑马鸿蒙笔记2
    1.图片设置:1加载网络图片,申请权限。申请权限:entry-src-resources-module.json5 2加载本地图片 ,两种加载方式API鼠标悬停在Image, 点击showinAPIReference interpolation:看起来更加清晰   resource格式,读取本地资源文件这里,先按需求读取en_U......
  • HTML学习 之 <input>标签
    目录标签属性type属性textpasswordnumberemailcheckboxradio<input>标签用于搜集用户信息。在html中,<input>标签可以没有结束标签,但在xhtml中<input>必须被正确地关闭。<input>标签属性<input>标签属性共约有29个,比较常用的是下面这几个:type规定input元素的类型......
  • 硬件算法协同优化-嵌入式深度学习3
    嵌入式深度学习-硬件与算法协同优化本系列博客主要以BertMoons《EmbeddedDeepLearning》翻译而成GoetschalckxK,MoonsB,LauwereinsS,AndraudM,VerhelstM(2018)Optimizedhierarchicalcascadedprocessing.IEEEJEmergingSelTopCircuitsSyst.https://doi.o......
  • javaScript学习笔记
    关于表单验证的简单实践注意点:1.函数的使用如果在script中需要调用某个function,例如checkUserName(),请确保在定义该函数时的写法为usernameInput.onblur=checkUserName;functioncheckUserName(){如果写成usernameInput.onblur=functioncheck......
  • (day 22)JavaScript学习笔记(内置对象1之Number、Math、Date)
    概述         这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。    今天学习JavaScript内置的对象,主要是Number、Math、Date。1.内置......
  • 2.4 比较检验 机器学习
    目录常见比较检验方法总述2.4.1假设检验2.4.2交叉验证T检验2.4.3McNemar检验接我们的上一篇《性能度量》,那么我们在某种度量下取得评估结果后,是否可以直接比较以评判优劣呢?实际上是不可以的。因为我们第一,测试性能不等于泛化性能,第二,测试性能会随着测试集的变化而......
  • 【无人机路径规划】基于深度强化学习的多无人机辅助边缘计算网络路径规划(Matlab代码实
    ......
  • MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
    以前微处理器(MPU)与微控制器(MCU)是截然不同的两种设备,MPU支持丰富的软件系统,如Linux和相关的软件堆栈,而MCU通常将专注于裸机和RTOS。近年来,随着MCU的性能越来越高,MCU和MPU之间的区别变得越来越模糊。STM32MP135是一款入门级的高性价比MPU,适用于MCU性能达不到要求或者需要跑Linux的......
  • golang学习路线
    golang学习路线学习Golang的路线可以分为以下几个阶段:基础语法:了解Golang的基本语法结构,包括变量声明、控制流、函数、指针等。数据类型:熟悉Golang的基本数据类型,如整型、浮点型、字符串、数组、切片、Map等。并发编程:学习Golang的并发编程特性,包括goroutines、channels和互斥......
  • 零基础自学网络安全的三个必经阶段(含学习路线图)
    一、为什么选择网络安全?这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。未来3-5年,是安全行业的黄金发展期,提前踏入行业,能享受行业发展红利。二、为什么说网络安全行......