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

来源:互联网 发布:现代文翻译古文软件 编辑:程序博客网 时间:2024/04/29 07:13

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

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

分析一下:长度为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 0
原创粉丝点击