实验任务
小明的东西被打包成一个个箱子,他请了搬家公司,用一辆大卡车运箱子。小明有 \(n\) 个箱子,每个箱子有各自的体积,卡车有能装下的总体积上限。每件箱子要么装车要么不装,不能装一部分。
小明想在不超过总体积上限的前提下,尽可能装满卡车,也就是让卡车的剩 余空间最小。请你求出这个最小剩余空间。
数据输入
输入第一行为两个正整数 \(n\), \(v\),表示箱子的数量及总体积上限。接下去 \(n\) 个正整数,表示每个箱子的体积,以空格隔开。
数据输出
输出一个数,表示最小剩余空间。
输入示例 | 输出示例 |
---|---|
3 11 3 7 3 |
1 |
数据范围
\(80\%\)的得分点,\(n\leq 12\),\(v\)及每个箱子的体积\(\leq 1000\);其余\(20\%\)的得分点,\(n\leq 32\),\(v\) 及每个箱子的体积\(\leq 10^9\)。
源代码
1 |
|
设计思路与复杂度分析
当问题的规模较大时,无法枚举所有元素的组合,但能够枚举一半元素的组合。此时可将问题拆成两半后分别枚举,再合并它们的结果。
本题中\(n\leq 32\),\(2^{32}\)数据范围太大,但是\(2^{16}\)却是一个可以接受的范围。所以考虑折半枚举算法。
本题为经典0-1背包问题,能够推导出动态规划的状态转移方程,但是由于\(v\)比较大,不能使用动态规划算法求解。注意与Moving3相区分。
两次枚举时间分别为\(O(2^{\frac n2})\),排序时间分别为\(O(n\times 2^{\frac n2-1})\),合并的时间为\(O(2^{\frac n2})\),所以总时间复杂度为:\(O(n\times 2^{\frac n2})\)。