動態規劃演算法--切鋼條問題
阿新 • • 發佈:2018-12-31
演算法導論中闡釋動態規劃演算法的第一節,就是鋼條切割問題:
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; } }