算法导论中阐释动态规划算法的第一节,就是钢条切割问题:
java代码简单实现了一下:
package cms.open.itPlatform.algorithm;
public class DynamicPlan {
public static void main(String[] args) {
int []p = {-9999,1,5,8,10,13,16,17,22,25,30};
System.out.println(new DynamicPlan().cut_rod(p, 7));
}
/**
*
* @param p[i]表示长度为i个单位的钢条的价值,比如:p[2]表示长度为2个单位的钢条的价值
* @param n表示钢条的总长度为n个单位
* @return 返回长度为n个单位的钢条,按最优切割方案时的最大价值
*/
public int cut_rod(int []p,int n)
{
int[]r = new int[n+1];
for (int i = 0; i < r.length; i++) {
r[i] = -9999;
}
return cut_rod_bottom(p, r, n);
}
/**
* 自底向上递归法(最优动态规划)
*
* @param p[i]表示长度为i个单位的钢条的价值,比如:p[2]表示长度为2个单位的钢条的价值
* @param r[i]表示长度为i个单位的钢条,按最优方案切割时的最大价值
* @param n表示钢条的总长度为n个单位
* @return
*/
private int cut_rod_bottom(int[]p,int[]r,int n)
{
if(r[n]>=0)
{
return r[n];
}
r[0]=0;
for(int index=1;index<=n;index++)
{
int q=-9999;
for(int cur=1;cur<=index;cur++)
{
q = max(q,p[cur]+r[index-cur]);
}
r[index] = q;
}
return r[n];
}
private int max(int v1,int v2)
{
return v1>=v2?v1:v2;
}
}