一、 题目描述
1、题目描述
- 有一个箱子容量为V(正整数,0≤V≤20000),同时有nn个物品(0<n≤30,每个物品有一个体积,正整数)。要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
2、输入格式
1个整数,表示箱子容量。
1个整数,表示有n个物品。
接下来n行,分别表示这n个物品的各自体积。
3、输出格式
1个整数,表示箱子剩余空间。
4、输入输出样例
样例输入
24
6
8
3
12
7
9
7
样例输出
0
二、解题思路
这一道题是一个明显的01背包 ,如果把这个箱子的体积当作重量,把这个箱子的体积当作价值的话,这道题的意思就是求解当总体积不超过m的书当中,体积(价值)最大的就是最优解,很显然,这是一道多阶段决策最优化问题。
1、数学建模
令dpi,j代表前i个货物,假如用背包容量为j的背包来装最多能装多少价值(体积)。
2、状态转移方程
dpi,j=max(dpi-1,j,dpi-1,j-w[i]+v[i])
具体的原因,就不用再讲了吧……
3、边界(初始化)
dpi,0=dp0,j=0;
如果是全局变量就不用单独赋值了。
三、空间优化(滚动数组)
因为前面讲的太简单了,所以来讲稍微难一点点的,其实也不难。
1、想法
这个想法是从列表开始的……
样例输入
8
6
1
3
4
5
6
10
样例输出
0
根据样例列表格
dp数组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 6 | 6 | 6 |
2 | 1 | 1 | 1 | 1 | 1 | 6 | 7 | 7 |
3 | 1 | 1 | 3 | 4 | 4 | 6 | 7 | 7 |
4 | 1 | 1 | 3 | 4 | 5 | 6 | 7 | 8 |
5 | 1 | 1 | 3 | 4 | 5 | 6 | 7 | 8 |
6 | 1 | 1 | 3 | 4 | 5 | 6 | 7 | 8 |
ans=m-dp6,8=8-dp6,8=0
2、思考
我们考虑dp4,5,它的取值和dp3,5和dp3,1有关,根据状态转移方程可以很开的得出,dp4,5=dp3,1+4=5,我们会发现,dpi,j的取值只与第i-1行有关,依此类体。第1行与第0行有关,第2行与第1行有关,第3行与第2行有关……所以我们会发现想要得到取值,只需要两行就满足了。
3、结论
dp数组 | 1 | 2 | 3 | …… | k-1 | k |
---|