目录
1.1 问题描述
1.2 问题的数学表示(规划类问题,此种表示可以转换为回溯法)
1.3 三种方法的比较
2.1 刻画一个最优解的结构特征(最优子结构)
2.2 递归地定义最优解的值(重叠子问题)
2.3 计算最优解的值,通常采用自底向上的方法
2.4 利用计算出的信息构造一个最优解
3.1 01背包问题的数学描述
3.2 用回溯法搜索解空间
3.3 一个示例
4.1 分支限界法解决0-1背包问题
4.2 一个示例
5.1 题目描述
5.2 转化为背包问题
1.问题描述
1.1 问题描述
假定n个商品重量分别为w 0 , w 1 , ..., w n-1 ,价值分别为p 0 , p 1 , ..., p n-1 ,背包载重量为M。怎样选择商品组合,使得价值最高?
1.2 问题的数学表示(规划类问题,此种表示可以转换为回溯法)
搜索的时候利用贪心性质(按照单位重量价值递减排序,估算可能的最高上界)、以及已经计算出的可行解作为界限进行剪枝。
但是回溯法,原则上要穷尽所有可能,只不过是对有些分支提前返回了。
剪枝方法同回溯法是一样的:利用贪心性质(按照单位重量价值递减排序,估算可能的最高上界)、以及已经计算出的可行解作为界限进行剪枝。
唯一的不同是,分支限界法利用的是优先队列,并且,当针对一个结点进行扩展时,会将所有儿子结点进行展开,计算出所有儿子结点所能达到的最高上界。因此,当一个优先队列中首结点是一个可行解,则结束。
回溯法是深度优先,要穷尽解空间的所有可能,找到最优解。
分支限界法是广度优先,本质上也是穷尽了解空间的所有可能,找到最优解。
2.动态规划
2.1 刻画一个最优解的结构特征(最优子结构)
那么S' = S - {i}必然是M - w i 的最优解
证明方法可以采用cut-paste方法进行证明
2.2 递归地定义最优解的值(重叠子问题)
一个包含商品i,p i + c[i-1, w- w i ];
一个不包含商品i,c[i-1, w];
两种情况中的较大者即为c[i, w]
最大值的估算法(跟分支限界法本质上是一样的)
3.2.3 回溯法的步骤描述
w_cur——表示当前正在搜索的部分解中转入的总重量
p_cur——当前总价值
p_est——部分解可能达到的最大价值的估计值
p_total——当前搜索到的所有可行解中的最大价值,是当前目标函数的上界
y
k
、x
k
——部分解的第k个分量及其副本
k——表示当前搜索深度
3.3 一个示例
M = 50
商品重量分别为5,15,25,27,30
商品价值分别为12,30,44,46,50
上面已经按照单位重量价值递减顺序排列。
4.1.1 分支方法(二叉分支)
当商品按照价值重量比递减排序后,s就是集合S 3 (k)中的第一个元素。特别地,当搜索深度为k时,商品s的序号就是集合S中的元素k。
S 1 (k+1) = S 1 (k) ∪ {k}
S 2 (k+1) = S 2 (k)
S 3 (k+1) = S 3 (k) - {k} 不把商品s装入背包的分支结点
S 1 (k+1) = S 1 (k)
S 2 (k+1) = S 2 (k) ∪ {k}
S 3 (k+1) = S 3 (k) - {k}
4.1.2 上界估算方法(按照单位价值最大进行贪心选择)
此时S 3 (k) = {k, k+1, ..., n-1}。用如下方法计算两种分支结点背包中商品价值的上界:
1)按照一个商品是否加入到S 1 集合,总共有2 n 个叶子节点,每个叶子节点对应一种情况
2)当一层一层向下搜索是,如果当前S 1 集合中的总重量超过了载重量M,则直接将b(k)置为0,该分支终止。
为什么这样做?因为在搜索上一层时,该商品不应该加入到S 1 集合,这种不加入该商品情况对应于另一个分支。加入该商品的此分支已经不满足要求了,所以剪枝。
4.1.3 分支限界法求解步骤
每个结点都包含如下信息:
S
1
——当前选择装入背包的商品集合
S
2
——当前不选择装入背包的商品集合
S
3
——当前尚待选择的商品集合
k——搜索深度
b——上界
bound——一个可行解的取值,当做剪枝的标准
X.b = 0
X.k = 0
X.S 1 = ∅
X.S 2 = ∅
X.S 3 = S
否则转向step4
Y.S 1 = X.S 1 ∪ {X.k}
Y.S 2 = X.S 2
Y.S 3 = X.S 3 - {X.k}
Y.k = X.k + 1
计算Y.b,将Y.b与bound进行比较,据此判定是否插入优先队列;当S 3 为空时,找到一个可行解,判定是否更新bound。
Z.S 1 = X.S 1
Z.S 2 = X.S 2 ∪ {X.k}
Z.S 3 = X.S 3 - {X.k}
Z.k = Z.k + 1
计算Z.b,将Z.b与bound进行比较,据此判定是否插入优先队列;当S 3 为空时,找到一个可行解,判定是否更新bound。
4.2 一个示例
有5个商品,重量分别为8,16,21,17,12,价值分别为8,14,16,11,7,背包的载重量为37,求装入背包的商品及其价值。
5.1 题目描述
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间
输入描述:
输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。
输出描述:
输出一个整数,表示最少需要处理的时间
输入例子:
5 3072 3072 7168 3072 1024
输出例子: