背包问题动态规划

经典动态规划——背包问题系列一

谁说胖子不能爱 提交于 2019-12-19 15:36:07
经典动态规划——背包问题系列一 复赛前发一波博客,虽然意义不是很大了…… 本篇讲的是背包问题基础 01背包问题 简述 有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 思路 动态规划的基本题,背包问题之母。 对动态规划有一定了解的人应该都应理解它的原理和方程。 所谓动态规划,就是把问题分成互相联系的多个阶段决策,每一步决策都能影响答案。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展。那么我们需要确定,各阶段之间的关系是什么以及各状态如何决策才能使答案最优。 在背包问题中,我们通常把背包容量设为状态。那么我们需要决策,到底如何放置物品,才能使各阶段背包在有限容量内装价值最多的物品? 首先我们需要知道:背包容量大的状态一定由容量小的状态转移过来,因为我们要不断选物品,这样是总重量越来越大。现在我们用f[i][j]示前i件物品恰放入一个容量为v的背包可以获得的最大价值。 我们只要枚举物品,在有限的空间里取物品,并一直取max,就能在规定背包空间内跑完。 \[ dp[i][v] = max(dp[i-1][v],dp[i-1][v-c[i]]+w[i]) \] 为什么要逆着枚举?因为容量大的状态要从容量小的状态转移过来,而我们要固定每个容量去装物品

01背包 完全背包混讲(未写完)

蹲街弑〆低调 提交于 2019-12-19 15:34:59
---emmm想写几篇关于背包的,先说一下自己对01背包和完全背包的理解,望大佬指教。 //emm这是重写的,原稿由于电脑死机,一节课写的东西都没有了... 先介绍一下我同位wst..我以后博客中应该都会拿他举栗子..已得到本人允许 写这篇博客前扯点废话(违心的夸一下wst)... 设 wst是一个 冰肌玉骨 冰姿玉骨 冰肌雪肤 才貌双全 才貌兼全 才貌两全 才貌双绝 沉鱼落雁 齿白唇红 齿如含贝 齿如齐贝 齿若编贝 出水芙蓉 初发芙蓉 唇红齿白 豆蔻年华 蛾眉皓齿 耳顺之年 二八佳人 二八美人 粉白黛黑 粉白黛绿 粉白墨墨 芙蓉出水 国色天香 国色天姿 鹤发童颜 花容月貌 花容玉貌 花颜月貌 炯炯有神 绝代佳人 绝世佳人 络腮胡子 落雁沉鱼的学霸 擅长 唱 跳 打篮球..(本人自己说的) 其实wst还有一个职业(情节需要) 他是一个神偷 他有几个神奇的背包 接下来我要介绍他第一个背包 01背包 有一个黑心商店 他的商品如下 编号 重(W) 价(v) 0 2 3 1 3 4 2 4 5 3 5 8 4 9 10 wst是一个数学天才,他喜欢做事情做到最好 而且喜欢列式子 现在他的01背包w(容量)=20 他设了 一个B,B表示总价值,设了两个参数k,w B(K,W) k表示前k个物品,w表示剩下的容量 什么意思呢 ~~举个例子B(2,20)当他物品剩余量为20时, 他可以选择编号0

背包九讲(2)

感情迁移 提交于 2019-12-19 15:32:22
P02: 完全背包问题 题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 这个问题非常类似于 01背包问题 ,所不同的是每种物品有无限件。也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件、取1件、取2件……等很多种。如果仍然按照解01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程,像这样: f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v} 这跟01背包问题一样有O(N*V)个状态需要求解,但求解每个状态的时间已经不是常数了,求解状态f[i][v]的时间是O(v/c[i]),总的复杂度是超过O(VN)的。 将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。但我们还是试图改进这个复杂度。 一个简单有效的优化 完全背包问题有一个很简单有效的优化,是这样的:若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。这个优化的正确性显然:任何情况下都可将价值小费用高得j换成物美价廉的i

背包问题(贪心算法)

蓝咒 提交于 2019-12-19 12:39:12
  贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。   贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题。贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细节想不通。这个问题以后有机会再讲。本次讲一讲背包问题。   背包问题就是有若干物品,每个物品有自己的价值和重量。背包有总重量。问题就是怎样将背包装的最大价值。背包问题也分很多种,贪心算法解决的是物品可以拆分的背包问题(就是物品可以分成几份装入)。这个问题用贪心还是比较好解决的。贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。此问题就是将每次的放入看成每一步,要想解决问题,就是将每一步都放入最优解。也就是说,每一次的放入都要放入最佳的选择。讲到这里,就要说一说最佳的选择,每一次的放入的最佳的选择就是每次放入的物品都是剩余的物品中价值最大且质量最小的,这里就要引入一个物品的属性,物品的权重值。物品的权重值就是指物品的价值除以物品的质量。所以,本问题的每一次的最佳选择就是每次都选出权重值最大的物品。  

贪心策略

回眸只為那壹抹淺笑 提交于 2019-12-19 12:38:58
之所以称之为“策略”,而不是“算法”,还是有些原因的,贪心思想和动态规划思想练习紧密,可是细想一下有不能混为一谈,动态规划是根据迁移过程的状态去推导下一过程的状态,是有理论依据的,通过每次“完美”的检验而得出最优解,关键是找出一个最优子结构,记得经典的一句话是:动态规划的子结构必须是独立的,而且是重叠的,虽然是一组反义词,可是代表的意义是不同的。扯远了,而贪心策略不同,贪心只考虑当前的最优解,是临时的,不连续的,所以得出的解不一定是最优解。 一个最间的的例子就是0-1背包问题,根据贪心,每次都放进去最“实惠”的,也就是“性价比”最高的,然后放次高的,直到不能放,这样做显然是不尽人意的,因为贪心策略没有考虑到背包的容量,为什么?前面说过了,贪心策略只考虑当前的最优解,他是不会管背包容量的,如果加入了背包容量这个参数,便成为DP问题了,贪心策略缺少一约束条件,贪心找出的每一条路径都是最大可能接近最优解的,例如:每条路径是最优解的可能性是0.8,贪心一共做了4次检查,于是正确的最优解得可能是(0.8)^4,可是他没有考虑其他的情况,问题就出现了。当然,贪心也有很多正确的策略,只是不适用某一问题罢了。 *********************************************************************** 下面开始看看贪心算法: 一.贪心算法的基本概念

动态规划0-1背包问题

你。 提交于 2019-12-16 21:29:10
最近看了一些简单的动态规划方面的例题 在学习的过程中发现 有的问题虽然不难 但是第一次看还是会有些问题 所以把自己弄0-1背包的问题拿出来给大家分享 不喜勿喷 网上资源特别多 讲解什么的就算了 其他人画的图都不错 递推关系 : 设所给 0-1 背包问题 的最优值为 m(i , j) ,即 m(i , j) 是背包容量为 j ,可选择物品为 i , i+1 , … , n 时 0-1 背包问题的最优值。由 0-1 背包问题的最优子结构性质,可以建立计算 m(i , j) 的递归式 : 上 式此时背包容量为 j ,可选择物品为 i 。此时在对 xi 作出决策之后 , 问题处于两种状态之一 : (1) 背包剩余容量是 j, 没产生任何效益; (2) 剩余容量 j-wi, 效益值增长了 vi ; 我写的代码 看完看有没有启发 package org.bq.dp; /** * 0-1背包问题 * * @author 白强原创 * @version 1.0 */ public class OneZero { // 最大背包容量 private static final int M = 10; // 物品数量 private static final int N = 3; // 物品重量数组 给它数组前面加一个0项是为了更好的表达这种关系 比方从一个到全部物品的时候i=2的使用w[i]

动态规划之背包问题

让人想犯罪 __ 提交于 2019-12-15 13:13:53
背包问题是动态规划的一个分支,这里先简单介绍一下动态规划的思想。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此在学习时,除了要对基本概念和方法正确理解外,必需具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。(以上来自百度百科) 简单来说动态规划是一个思想,而不是一个固定的算法模板,我们需要通过这种思想确定状态转移方程(一个好的状态),然后再求解。 动态规划适用于很多情况,其中一些情况被统一划分归类,而背包问题则是一种最为常见的动态规划问题。 背包问题又分为许多种,如:01背包,完全背包等 我们这里介绍最为常见的三种,分别是01背包,完全背包,和多重背包。 1.01背包 这是一个经典的动态规划问题,另外在贪心算法里也有背包问题,至于二者的区别在此就不做介绍了。 题目一般都是有 N件物品和一个容量为 V的背包。第 i件物品的体积是 v[i],价值是 c[i]

01背包算法

时光总嘲笑我的痴心妄想 提交于 2019-12-10 03:55:35
转: 01背包问题 动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算。通常用来求最优解,且最优解的局部也是最优的。求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解。 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分。 2. 定义状态。往往将和子问题相关的各个变量的一组取值定义为一个状态。某个状态的值就是这个子问题的解(若有 k个变量,一般用 K维的数组存储各个状态下的解,并可根 据这个数组记录打印求解过程。)。 3. 找出状态转移方程。一般是从一个状态到另一个状态时变量值改变。 4.以“自底向上”的方式计算最优解的值。 5. 从已计算的信息中构建出最优解的路径。(最优解是问题达到最优值的一组解) 其中步骤1~4是动态规划求解问题的基础,如果题目只要求最优解的值,则步骤5可以省略。 背包问题 01背包: 有N件物品和一个重量为M的背包。(每种物品均只有一件)第i件物品的重量是w[i],价值是p[i]。求解将哪些物品装入背包可使价值总和最大。 完全背包: 有N种物品和一个重量为M的背包,每种物品都有无限件可用。第i种物品的重量是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大。 多重背包: 有N种物品和一个重量为M的背包

背包(0-1)问题

∥☆過路亽.° 提交于 2019-12-09 18:18:07
背包容量是C,可容纳N件商品,每件商品要么放要么不放,商品的重量数组W[ ],价值数组V[ ]。 通过动态规划算法,建立矩阵M[N][C]。 M[i][j]的含义为,往背包里放从0-i的物品的最大价值,j为背包容量。 M[i][j]的有两种选择:一是,不放当前物品i,M[i-1][j];二是,放当前物品i,则值为 V[i]+M[i-1][j-W[i]]。也就是当前物品的价值加上,背包容量为j-W[i],放0-i-1物品的最大价值。 矩阵里的每个值都是子问题的最优解,也就是背包在容量为j,容纳物品为0-i的最大价值。 还有一个问题,如何判定装入了哪个物品,由矩阵生成过程,可以知道,当M[i][j] != M[i-1][j]时,放入了物品i。以此类推,可以得到所有放入背包中的物品。 来源: CSDN 作者: anjingjingg 链接: https://blog.csdn.net/anjingjingg/article/details/103461763

彻底理解0-1背包问题

南楼画角 提交于 2019-12-08 11:31:27
0-1背包问题 给定n个重量为 w 1 w_1 w 1 ​ , w 2 w_2 w 2 ​ , w 3 w_3 w 3 ​ ,…, w n w_n w n ​ ,价值为 v 1 v_1 v 1 ​ , v 2 v_2 v 2 ​ , v 3 v_3 v 3 ​ ,…, v n v_n v n ​ 的物品和容量为 C C C 的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大 0-1背包问题指的是每个物品只能使用一次 递归方法 首先我们用递归的方式来尝试解决这个问题 我们用 F ( n , C ) F(n,C) F ( n , C ) 表示将前 n n n 个物品放进容量为 C C C 的背包里,得到的最大的价值。 我们用自顶向下的角度来看,假如我们已经进行到了最后一步(即求解将 n n n 个物品放到背包里获得的最大价值),此时我们便有两种选择 不放第 n n n 个物品,此时总价值为 F ( n − 1 , C ) F(n-1,C) F ( n − 1 , C ) 放置第 n n n 个物品,此时总价值为 v n + F ( n − 1 , C − w n ) v_n+F(n-1,C-w_n) v n ​ + F ( n − 1 , C − w n ​ ) 两种选择中总价值最大的方案就是我们的最终方案,递推式(有时也称之为状态转移方程)如下 F