鋼條切割問題

2022-05-12 22:46:45 字數 1226 閱讀 4649

問題描述:假設公司**長度為i的鋼條**為pi,如下**表:

長度i123

4567

8910**pi15

891017

1720

2430

給乙個n長度鋼條和乙個**表,求切割方案使得總收益最大。

分析:當問題長度為n時候,每隔一公尺有兩種選擇(切或者不切),從而切割方案有2n種,如果用暴力來求解,複雜度會達到指數次方,比如乙個長度為4的鋼條可以有以下切割方案:

(1)4=1+1+1+1(2)4=1+3(3)4=2+2(4)4=3+1(5)4=1+1+2(6)4=1+2+1(7)4=2+1+1(8)4=4;

比較刻字方案(3)的收益最高為10,從而方案(3)為最佳切割方案。

為啦求解規模為n的問題,我們可以求解問題一樣但是規模更小的問題,當我們完成首次切割後,我們將剩下鋼條看做兩個獨立的鋼條切割問題,我們通過求解兩個子問題最優解來構造原問題最優解,及說明此問題

有最優最結構的性質:我們將鋼條從左切割下長度為i的一段,只對右邊長度為n-i的一段進行繼續切割,問題分解方式為:將問題從左邊切割下一段,將右邊部分繼續做相同的分解,若剩餘長度為0則收益也為0,

rn=max(1=方法1,自頂向下:

int cutrod(int price, int *r, int n)

r[i] = q; //計算完長度為i的鋼條的造價收益儲存

}return q;

}兩種**的時間複雜度都是o(n2).如果要重構解的問題,輸出具體的切割方案,則還需要乙個陣列s[n]來儲存切割方案:

int *cutrod2(int price, int *r, int n)

r[i] = q; //計算完長度為i的鋼條的造價收益儲存

}return s;

}如果要構造問題解的方案,這需要乙個陣列s[n]來儲存切割的位置:

//----鋼條切割2,動態規劃

#include

#include

using namespace std;

int cutrod2(int price, int *r,int*s ,int n);

int main()

return 0;

}int cutrod2(int price, int *r,int *s, int n)

}r[i] = q; //計算完長度為i的鋼條的造價收益儲存

}return q;

}

鋼條切割問題

動態規劃的一般步驟 1.刻畫乙個最優解的結構特徵 2.遞迴定義最優解的值 3.計算最優解的值,通常採用自底向上的方法 4.利用計算出的資訊構造乙個最優解 利用動態規劃方法求解類似鋼條切割方案的這一類遞迴問題,可避免反覆求解相同的子結構,下面是樸素遞迴演算法和用動態規劃設計的遞迴演算法的相應實現。鋼條...

鋼條切割問題

class program 索引代表 鋼條的長度,值代表 console.writeline updown 0 p console.writeline updown 1 p console.writeline updown 2 p console.writeline updown 3 p conso...

鋼條切割問題

對應於演算法導論上的鋼條切割問題。package dynamic programming 動態優化問題之鋼條切割問題 長度i 1 2 3 4 5 6 7 8 9 10 p 1 5 8 9 10 17 17 20 24 30 問題,對於長度為i的鋼條,怎麼切割,使之價值最大。public class ...