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

背包 dp 学习笔记

时间:2024-06-03 15:43:51浏览次数:16  
标签:件物品 容量 笔记 背包 此时 价值 dp

背包类问题是动态规划中的一类重要问题

1. 01 背包

有 \(n\) 件物品和一个容量为 \(v\) 的背包。第 \(i\) 件物品的费用是 \(c_i\),价值是 \(w_i\)。求解将哪些物品装入背包可使价值总和最大。

1.1 基本思路

我们首先定义此问题的 dp 状态 \(f_{i,j}\) 表示前 \(i\) 件物品放入一个容量为 \(j\) 的背包的最大价值。

接下来,我们考虑它的状态转移方程是什么。我们假设此时有前 \(i\) 件物品,背包容量为 \(j\)。如果我们此时只看第 \(i\) 件物品,有以下两种选择:

  • 如果不选第 \(i\) 件物品,那么此时背包就只能放入前 \(i-1\) 件中的某些物品,由于没有放入第 \(i\) 件物品,不占用空间,所以背包容量仍为 \(j\)。此是问题就被转换为了将前 \(i-1\) 件物品放入一个容量为 \(j\) 的背包的最大价值,即 dp 状态 \(f_{i-1,j}\)。

  • 如果此时选入第 \(i\) 件物品,那么就会占用 \(c_i\) 的空间,也就是说前 \(i-1\) 件物品最多只能占用 \(j-c_i\) 的空间,所以此时前 \(i-1\) 件物品的最大价值为 \(f_{i-1,j-c_i}\)。因为此时选入了第 \(i\) 件物品,那么就要加上它的价值,所以最终选入第 \(i\) 件物品的最大价值为 \(f_{i-1,j-c_i}+w_i\)。

现在我们易得状态转移方程为 \(f_{i,j}\gets\max{f_{i-1,j},f_{i-1,j-c_i}+w_i}\)。由于只有选与不选两种决策,分别与 \(0\) 和 \(1\) 对应,故称之为 01 背包问题。

for(int i=1;i<=n;i++)
{
    for(int j=1;j<=v;j++)
	{
    	if(j>=c[i])
    	{
    		dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);
		}
		else dp[i][j]=dp[i-1][j];
	}
}

标签:件物品,容量,笔记,背包,此时,价值,dp
From: https://www.cnblogs.com/zhuluoan/p/18229024

相关文章

  • 题目乱做笔记 Part2
    CF1824D考虑如何快速计算\(g(i,j)\),设\(nxt_i\)表示\(i\)后面第一个等于\(i\)的数,那答案显然是最大的\(p\)满足不存在\(k\in[i,p-1],nxt_k>j\)。从大到小扫描\(i\)这一维,问题变成区间覆盖,区间求历史最值和,显然可以直接上线段树,但是需要卡常。同时也可以使用颜色......
  • 退背包简介 / NOI模拟 卖画
    退背包介绍之前居然完全没了解过“退背包”,其实是个很易于接受的思路,看了下最简单的板子题居然是个黄题,离谱。退背包的原理在于根据题意与状态设计,阶段顺序并不影响最终的答案,因此之前某个阶段的贡献是可以撤销的。具体撤销的方法就是通过原先从\(f_{i-1}\)转移到\(f_i\)的......
  • 《Python进阶》学习笔记
    《Python进阶》学习笔记部分原创,仅个人关于《Python进阶》的学习笔记importwarnings#忽略警告warnings.filterwarnings("ignore")*args的用法deftest_args(f_arg,*argv):print("第一个参数是:",f_arg)forarginargv:print("其他argv参数是:",arg)......
  • idear集成开发工具学习笔记
    idea导入git项目Filw-->New-->ProjectfromVersionControl-->Gitidea控制台tomcat日志中文乱码1、找到本地tomcat的conf目录下的logging.properties,对于控制台output报错的情况,将下图位置的编码格式,改成gbkjava.util.logging.ConsoleHandler.encoding=GBK2、TomcatLocathost......
  • html语言学习笔记
    语法<p></p>段落<br/>段内换行<h1~h6>标题<pre></pre>预留格式文本,保留空格和空行,不用写<br/>和&nbsp;<span></span>行内组合用法:组合行内元素,方便css样式来格式化。例子:<styletype="text/css">span{color:blue;font-weight:bold;}</......
  • Python学习笔记(一)
    PS:这篇文章是以一个学习者的角度来汇总知识点以及教程,对于想学习Python的入门者也会比较友好,想学习python可以先收藏,我会慢慢持续更新。学艺不精,如有纰漏,敬请指正。需要安装配置python和Pycharm软件可以移步这篇文章,有详细的教程。传送门:python及pycharm安装配置-CSDN博客P......
  • Lenovo笔记本F1-F12功能快捷键分别是什么功能
        在日常工作和学习中,我们经常需要使用笔记本电脑来完成各种任务。为了提高操作效率,许多用户会选择使用键盘上的快捷键。Lenovo笔记本的F1-F12功能快捷键为用户提供了一种快速访问计算机功能和设置的方式。    F1键通常用于打开帮助和支持中心,而F2键则用于......
  • DataFrame基本操作笔记
    目录DataFrameDataFrame特点:创建实例-使用列表创建实例-使用字典创建实例-使用NumPy数组创建实例-使用Series创建实例-使用ndarrays创建返回数据DataFrame的属性和方法访问DataFrame元素访问行:使用行的标签和.loc[]访问。修改DataFrame添......
  • Go 语言学习笔记之数组与切片
    大家好,我是码农先森。数组与切片的区别在Go语言中,数组和切片是两种不同的数据结构,它们之间有以下主要区别。参数长度:数组(Array):数组的长度是固定的,在创建时就需要指定数组的长度,无法动态改变;只有长度信息,通过len()函数获取。切片(Slice):切片是对数组的一个引用,底层使用的是......
  • PDPS二次开发插件流程
    PDPS二次开发插件流程一.第一步通过C#创建插件dll1.在本地安装PDPS的安装目录下找到eMpower下的Tecnomatix.Engineering.dll,Tecnomatix.Engineering.Ui.dll2.在vs中新建winform窗体,引用以上目录下的两个dll文件3.新建一个类文件例如叫FristTestPlugin,继承Engineering下的TxBut......