[java] 动态规划

引言(动态规划之装载问题)

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

为了省事,我一股脑的把所有网格都列出来了,下面将介绍网格是怎么一步步生成的

  1. 首先网格是空的,j表示船的最大装载量,i表示第i个箱子的重量,m[i][j]就表示船可以装下的最大重量。
  2. 这里的网格是从上到下逐渐生成的,先是只有6号箱子,也就代表目前你只能装6号箱子到船上,所以只能是j>=6的时候才能放进去,第一行的值就是这么定下来的。
  3. 现在考虑5号箱子,也就是现在可以在船上放6号和5号箱子。所以j=5的时候可以放5号箱子了,j=11和12的时候可以把5号和6号都放进去。
  4. 同理,一直推理到最后一行最后一列,就得出了最终的结果。

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][ja[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][ja[i]]+a[i])
    在这里插入图片描述

例如:求解m[3][9],它表示考虑3-6号箱子,可接受容量为9时的最大装载量

  • 3号箱子不放,那么相当于表示考虑4-6号箱子,可接受容量为9时的最大装载量
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值