动态规划—0-1背包问题

       算法是对特定问题求解步骤的一种描述,或定义解决某问题的规则,算法的设计和实现体现了计算机破解过程。算法的设计也是一种思想和智慧的结晶,常用的算法设计技术主要有分治法、动态规划法、贪心法、回溯法和分支界限法。其中分治思想贯彻各个算法,分治,分而治之,即将复杂问题分解成一系列子问题,递归的求解各子问题,然后合并子问题的解即原问题的解。其中分解的子问题是相互独立,且是原问题的较小模式。对几种算法的学习都拿背包问题来分析研究,其中动态规划和回溯法都属于0-1背包,而贪心算法属于部分背包问题。贪心算法即按着物品的单位价值由大到小往背包中放物品,物品可拆分,直到背包放满为止,得到的一定是当前的最后解。主要介绍动态规划和回溯法在0-1背包中的应用。

问题描述:

       有n种物品和一个重量为W的背包,第i种物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包重量,且物品总价值价值最大。假设n=5W=17

求解步骤:

1、刻画0-1背包最优解结构;

如果有n个物品,用Xi表示第i个物品的状态。Xi 的值为0或1。0表示物品未进入背包,1表示物品进入背包。

如果一个最优解中包含n,即Xn=1,那么其余X1X2,…,X(n-1)一定构成子问题1,2,…,(n-1)在容量W-wi的最优解。如果Xn=0,则构成在W时的最优解。

2、递归定义最优解的值;

c[ i,w ]表示背包容量为wi个物品导致的最优解的总价值。得到下式:

动态规划—0-1背包问题_第1张图片

第一种情况:i=0w=0分别表示放入的物品个数为0,背包容量为0,此时谈不上物品的总价值。

第二种情况:wi>w表示第i个物品的重量大于背包的重量,此时i放不进去,构成在i-1上的最优解的问题。

第三种情况:表示物品i可以放入,此时求总价值最大有两种情况:i在包中,总价值为c[i-1,w-wi]+vii不在包中,同第二种情况,转换为在i-1上的最优解问题,即c[i-1w]

3、计算背包最优解的值。

       由上述公式,考虑一个问题的最优解必须依赖前一个子问题的最优解,所以我们从背包容量为0开始考虑,逐渐增大背包容量,体现一个动态的过程,而考虑在可选物品是否应该放入背包中时,我们先拿一个物品是否在不在,然后在此基础上考虑另一个物品在不在,在比较在或不在求最大价值体现规划的过程。

表示背包容量动态变化过程中,物品是否可以放入,1表示放入,*表示不能放入。

动态规划—0-1背包问题_第2张图片

表示 物品按单位价值比顺序考虑问题最优解。

 动态规划—0-1背包问题_第3张图片

使用场景:

        最优子结构:如果一个问题的最优解中包含子问题的最优解,就说该问题具有最优子结构。当然一个问题具有最优子结构时贪心也可能适用。

          重叠子问题:对每个子问题仅计算一次,把解保存在一个在需要时可以查看的表中。

对比分治法:

       待解问题也分解成若干子问题,但子问题都不独立,用一个表来记录所有已解决子问题的答案,不管子问题是否被用到,只要计算过,就将其结果填入表中。

你可能感兴趣的:(动态规划—0-1背包问题)