经典算法之动态规划(一):入门级动态规划
2015-09-29 17:39
302 查看
终于要写高大上的动态规划啦~~虽然面对高难度的题目还是没底,但是简单的可用一维数组记录各子问题的解的入门级动态规划是已经OK的啦~下面以一个钢条切割的问题为例来讲述动态规划。
假设一公司进了一批长为10的钢条,打算切割然后去卖,各种长度的钢条的价格如下表:
分析一下:长度为i 的钢条的价格记为r[i],假设总长度为u 的钢条经最优方案切割后总价格为price[u],显然price[10] 即为所求。对于长度为i 的钢条,其切割的方案有太多种,切一刀,切两刀……各刀分别切在哪里等等,这里我们只考虑第一刀切在哪里,这样方案就变成了i 种,而切完第一刀之后剩下的部分,又成了一个和原问题一样的子问题,假设第一刀切掉了i-u,余下的部分是u,我们再知道长度为u的钢条的最优价格就OK了,而由于我们是从小到大开始计算的,当计算price[i]时,price[u] (u<i)早已计算完毕。代码如下:
得到的结果是:
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
假设一公司进了一批长为10的钢条,打算切割然后去卖,各种长度的钢条的价格如下表:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 25 |
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
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统