#5. 背包问题最优解算法证明
题目描述
在 0-1 背包问题中,有一个背包和若干物品,需要找出如何选取物品放入背包,能够最大化背包中物品的总价值。本问题中,每件物品要么不放入背包,要么完整地放入背包。
试证明该问题的最优解包含其"子问题"的最优解(这是该问题动态规划算法正确性的基础)。
问题设置
- 物品数量为 ,背包容量为
- 将各件物品编号为
- 函数
caps : ℕ → ℕ给出每件物品的体积 - 函数
vals : ℕ → ℕ给出每件物品的价值
可以用函数 s : ℕ → Option Bool 表示从物品 中选取物品放入背包的方案:
s i = some true表示物品 放入背包s i = some false表示物品 不放入背包s i = none表示方案中不包含关于物品 的信息
任务
1. wf_clr (25 分)
theorem wf_clr (N : ℕ) (s : ℕ → Option Bool) (n : ℕ) :
1 ≤ n ∧ n ≤ N → wf s n → wf (clear s n) (n - 1)2. wf_set_s (25 分)
theorem wf_set_s (s : ℕ → Option Bool) (n : ℕ) (b : Bool) :
1 ≤ n → wf s (n - 1) → wf (set_s s n b) n3. clr_set (20 分)
theorem clr_set (s : ℕ → Option Bool) (n : ℕ) :
s n = none → clear (fun j => if j = n then some true else s j) n = s4. optimal_substructure (80 分)
若 是从物品 至 中选取物品放入背包中容量为 c_rem 的一部分空间中的最优方案,且 选择将物品 放入背包,则 中除去物品 以外的部分是从物品 至 中选取物品放入背包中容量为 c_rem - caps n 的一部分空间中的最优方案。
theorem optimal_substructure (N : ℕ) (caps vals : ℕ → ℕ) (s : ℕ → Option Bool) (n c_rem : ℕ) :
1 ≤ n ∧ n ≤ N → s n = some true → caps n ≤ c_rem →
opt_s caps vals s n c_rem →
opt_s caps vals (clear s n) (n - 1) (c_rem - caps n)提示:可考虑采取反证法思路。
分值
- wf_clr: 25 分
- wf_set_s: 25 分
- clr_set: 20 分
- optimal_substructure: 80 分
总计: 150 分