您的位置:首页 > 其它

切钢条问题

2016-09-14 23:40 169 查看
package DynamicProgram;

import org.junit.Test;
import Sort.Array;

// 算法分析与设计一书中钢条切割问题

public class CutRod {

/**
*              返回包含最优解的数组
* @param p  p[i]表示长度为i的钢条长度的售价
* @param n  钢条的长度,单位为英寸
*/
public int [] bottomUpCutRod(int [] p, int n) {
// 用来保存当钢条的长度为n时,最优情况下首次切割左边钢条的长度
int [] array = new int [n + 1];
array[0] = 0;
// 长度为i的子问题
for(int i = 1; i <= n; ++i) {
// 用来保存最小的代价
int cost = -1;
for(int j = 1; j <=i; ++j)
// p[j]表示长度为j的钢条所花费的代价
// array[i - j]表示长度为i-j的钢条所花费的代价,前面已经计算出来了
// 之所以不断的保存cost,是为了计算整趟循环中的最大值
cost = Math.max(cost, p[j] + array[i - j]);
// 将长度为i的子问题的最低花费保存到数组中
array[i] = cost;
}
return array;

}

@Test
public void test(){
int [] p = {-1, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
int [] array = bottomUpCutRod(p, 10);
Array.print(array);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: