题目描述
有一个箱子容量为V(正整数,0 <= V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积)。要求n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。
输入:n(箱子总容量)
k(物品的个数)
接下来k行为k个物品的体积
输出: 装入k个物品后的最小体积
这是一道典型的动态规划问题,基本方法可参考我的上一篇题解
https://blog.youkuaiyun.com/m0_49980202/article/details/120269167?spm=1001.2014.3001.5501
这里主要说一下对于二维数组的优化问题,时间上的复杂度根据输入可大可小不好优化,主要优化下空间复杂度。首先我们得确定目标是什么,根据本题,目标就是为了得到前k个物品后的最小装箱容量。所以我们需要得到的仅仅是第k个物品后的最优解,而根据背包问题的基本解法,得到的也是同样的结果,不过每行的变化数据仅为几个,绝大多数的数据都是承接上一状态罢了,这就造成了极大的空间上的浪费。
采用一维数组优化的方法,可以在空间上实现极大的优化。
若采用此方法,无非是要把之前的关系式用一维替代
替代一:dp[j] = j------- dp[i][j] = dp[i-1][j]
替代二