引言(动态规划之装载问题)
1、问题描述
一艘船可装载重量为12,有6个集装箱,各自的重量为a[n]=[1,2,3,4,5,6],设计一个可以装载的方案,使得船装下集装箱重量最大
2、问题解决
比较有趣的一句话是:每个动态规划都从一个网格开始。 (所以学会网格的推导至关重要,而有些题解之所以写的不好,就是因为没有给出网格的推导过程,或者说,没有说清楚为什么要”这样“设计网格。)
装载问题的网格如下:
m[i][j] | j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
i | ||||||||||||||
6 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | |
5 | 0 | 0 | 0 | 0 | 0 | 5 | 6 | 6 | 6 | 6 | 6 | 11 | 11 | |
4 | 0 | 0 | 0 | 0 | 4 | 5 | 6 | 6 | 6 | 9 | 9 | 11 | 11 | |
3 | 0 | 0 | 0 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 9 | 11 | 11 | |
2 | 0 | 0 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 11 | |
1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
为了省事,我一股脑的把所有网格都列出来了,下面将介绍网格是怎么一步步生成的
- 首先网格是空的,j表示船的最大装载量,i表示第i个箱子的重量,m[i][j]就表示船可以装下的最大重量。
- 这里的网格是从上到下逐渐生成的,先是只有6号箱子,也就代表目前你只能装6号箱子到船上,所以只能是j>=6的时候才能放进去,第一行的值就是这么定下来的。
- 现在考虑5号箱子,也就是现在可以在船上放6号和5号箱子。所以j=5的时候可以放5号箱子了,j=11和12的时候可以把5号和6号都放进去。
- 同理,一直推理到最后一行最后一列,就得出了最终的结果。
3、状态转移方程
现在我们来提取一下里面的规律,假设现在i+1到n号箱子都已经考虑完了,现在该考虑第i号箱子了,这个时候有两种情况
- 第i号箱子不放进去:那么 m [ i ] [ j ] = m [ i + 1 ] [ j ] m[i][j]=m[i+1][j] m[i][j]=m[i+1][j]
- 第i号箱子放进去: m [ i ] [ j ] = m [ i + 1 ] [ j − a [ i ] ] + a [ i ] m[i][j]=m[i+1][j-a[i]]+a[i] m[i][j]=m[i+1][j−a[i]]+a[i]
- 综上: m [ i ] [ j ] = m a x ( m [ i + 1 ] [ j ] , m [ i + 1 ] [ j − a [ i ] ] + a [ i ] ) m[i][j]=max(m[i+1][j],m[i+1][j-a[i]]+a[i]) m[i][j]=max(m[i+1][j],m[i+1][j−a[i]]+a[i])
例如:求解m[3][9],它表示考虑3-6号箱子,可接受容量为9时的最大装载量
- 3号箱子不放,那么相当于表示考虑4-6号箱子,可接受容量为9时的最大装载量