
数据结构与算法
文章平均质量分 70
HeyBlog
less is more.
展开
-
【背包问题】背包问题求具体方案
一、题目有 NNN 件物品和一个容量是 VVV 的背包。每件物品只能使用一次。第 iii 件物品的体积是 viv_ivi,价值是 wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出字典序最小的方案。这里的字典序是指:所选物品的编号所构成的序列。物品的编号范围是 1…N。输入格式第一行两个整数,NNN,VVV,用空格隔开,分别表示物品数量和背包容积。接下来有 NNN 行,每行两个整数 vi,wiv_i,w_ivi,wi,用空格隔开,分别表示第 iii原创 2021-08-23 21:45:12 · 294 阅读 · 0 评论 -
【背包问题】背包问题求方案数
一、题目有 NNN 件物品和一个容量是 VVV 的背包。每件物品只能使用一次。第 iii 件物品的体积是 viv_ivi,价值是 wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最优选法的方案数。注意答案可能很大,请输出答案模 109+710^9+7109+7 的结果。输入格式第一行两个整数,NNN,VVV,用空格隔开,分别表示物品数量和背包容积。接下来有 NNN 行,每行两个整数 vi,wiv_i,w_ivi,wi,用空格隔开,分别表示第 i原创 2021-08-23 19:48:30 · 378 阅读 · 0 评论 -
【背包问题】有依赖的背包问题
一、问题这种背包问题的物品间存在某种“依赖”的关系。也就是说,物品 i 依赖于物品 j,表示若选物品 i,则必须选物品 j。我们直接用一个题目来解释这个问题,题目如下。题目:有 NNN 个物品和一个容量是 VVV 的背包。物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。如下图所示:如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。每件物品的编号是 iii,体积是 viv_ivi,价值是 wiw_iwi,依赖的父节点编号是转载 2021-08-23 17:22:57 · 555 阅读 · 0 评论 -
【背包问题】 分组背包问题
一、问题有 NNN 件物品和一个容量为 VVV 的背包。第 iii 件物品的费用是 CiC_iCi,价值是 WiW_iWi。这些物品被划分为 KKK 组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。二、思路这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设 F[k,v]F [k, v]F[k,v] 表示前 kkk 组物品花费费用 vvv 能取得的最大权值,则有:F[k,v]=max{F[k−1,v]原创 2021-08-23 16:19:30 · 539 阅读 · 0 评论 -
【背包问题】混合背包问题
一、题目有 NNN 种物品和一个容量是 VVV 的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用 sis_isi 次(多重背包);每种体积是 viv_ivi,价值是 wiw_iwi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。二、思路既然是3种背包的混合问题,那么我们其实可以直接调用前面几篇博客写过的算法,伪代码如下:for(int i = 1; i <= N; i原创 2021-08-23 15:14:07 · 618 阅读 · 2 评论 -
【背包问题】二维费用背包问题
一、问题二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种费用。对于每种费用都有一个可付出的最大值(背包容量)。问怎样选择物品可以得到最大的价值。设第 iii 件物品所需的两种费用分别为 CiC_iCi 和 DiD_iDi。两种费用可付出的最大值(也即两种背包容量)分别为 VVV 和 UUU。物品的价值为 WiW_iWi。二、思路费用加了一维,只需状态也加一维即可。设dp[i][j][k]dp[i][j]{\color{Red} [k]}dp[i][j][原创 2021-08-23 11:14:00 · 781 阅读 · 0 评论 -
【背包问题】多重背包问题
一、多重背包问题1.1 题目有 NNN 种物品和一个容量为 VVV 的背包。第 iii 种物品最多有 MiM_iMi 件可用,每件耗费的空间是 CiC_iCi,价值是 WiW_iWi。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。1.2 思路这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可。因为对于第 iii 种物品有 Mi+1M_i + 1Mi+1 种策略:取 0 件,取 1 件……取 MiM_iMi 件。令 F[i,v]F原创 2021-08-21 15:41:20 · 251 阅读 · 0 评论 -
【背包问题】完全背包问题
一、完全背包问题1.1 题目有 NNN 种物品和一个容量为 VVV 的背包,每种物品都有无限件可用。放入第 iii 种物品的费用是 CiC_iCi,价值是 WiW_iWi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大。1.2 基本思路这个问题非常类似于 01 背包问题,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取 0 件、取 1 件、取 2件……直至取⌊V/Ci⌋⌊V /C_i⌋⌊V/Ci⌋ 件等许多原创 2021-08-21 15:36:10 · 3930 阅读 · 0 评论 -
【背包问题】01背包问题
一、01背包问题1.1 题目有NNN件物品和一个容量为VVV的背包,放入第iii件物品耗费的费用是CiC_iCi,得到的价值是WiW_iWi。求解将哪些物品装入背包可使得价值总和最大。1.2 基本思路01背包是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或者不放。用子问题定义状态:即 F[i,v]F[i,v]F[i,v] 表示前 iii 件物品恰放入一个容量为 vvv 的背包可以获得的最大价值。则其状态转移方程便是:F[i,v]=max{F[i−1,v],f[i−1,v−Ci]+原创 2021-08-21 11:48:48 · 673 阅读 · 0 评论