经典算法之动态规划(一):入门级动态规划

终于要写高大上的动态规划啦~~虽然面对高难度的题目还是没底,但是简单的可用一维数组记录各子问题的解的入门级动态规划是已经OK的啦~下面以一个钢条切割的问题为例来讲述动态规划。

假设一公司进了一批长为10的钢条,打算切割然后去卖,各种长度的钢条的价格如下表: 

12345678910
1589101717202425

分析一下:长度为i 的钢条的价格记为r[i],假设总长度为u 的钢条经最优方案切割后总价格为price[u],显然price[10] 即为所求。对于长度为i 的钢条,其切割的方案有太多种,切一刀,切两刀……各刀分别切在哪里等等,这里我们只考虑第一刀切在哪里,这样方案就变成了i 种,而切完第一刀之后剩下的部分,又成了一个和原问题一样的子问题,假设第一刀切掉了i-u,余下的部分是u,我们再知道长度为u的钢条的最优价格就OK了,而由于我们是从小到大开始计算的,当计算price[i]时,price[u] (u<i)早已计算完毕。代码如下:

public class CutSteel {

	static int[] r = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 25};
	static int[] price = new int[11];
	static int length = 0;//第一刀切在哪里
	static int[] lengths = new int[11];
	public static void main(String[] args) {
		cut();
		System.out.println(price[10]);
		for(int i=0; i<11; i++){
			System.out.print(lengths[i]+" ");
		}
	}
	private static void cut() {
		price[1] = 1;
		for(int i=2; i<=10; i++){
			int max = r[i];
			length = 0;
			for(int u=1; u<i; u++){
				if(r[i-u]+price[u]>max){
					max = r[i-u]+price[u];
					length = i-u;
				}
			}
			price[i] = max;
			lengths[i] = length;
		}
	}
}


得到的结果是:

27
0 0 0 0 2 3 0 6 6 6 6

lengths[10]=6,也就是说长度为10的钢条第一刀切掉长度为6的部分,剩下长度为4,而lengths[4]=2,也就是说再切掉长度为2的部分,lengths[2]=0,也就是说不用再切了,于是最优的切割方案是切成6,2,2长的钢条,可卖得价格27

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值