鋼材切割問題

2021-09-20 01:33:26 字數 1471 閱讀 4091

已知鋼材的總長,訂單數和各訂單需要的長度編制程式從訂單中選擇一組訂單對鋼材作切割加工, 使得鋼材得到最佳應用,約定,每次切割損耗固定長度的鋼材。

下面寫一下我的思路,剛開始沒有想明白應該怎麼使用遞迴去做,但是,看了他們的**之後,走了一遍,才明白,其實思路不太好想,但是實現起來還是比較容易的。

假設,我們有一段鋼材,長度為12公尺,其中有3個訂單,分別需要的長度為5,6,9公尺,每次切割總會有2公尺的損耗,求得其最佳訂單組合。

現在我們想想一下我們正常的思路:

如果是只有乙個訂單的話,9公尺的訂單是最合適的,加上2公尺的耗材,一共11公尺。

如果有兩個訂單的話,有組合5,6;5,9;6,9這三個組合,很明顯,這三個組合都已經超過了12公尺的長度,因為如果是5,6的話,雖然說訂單的和為11,但是有兩次切割,還會有4公尺的耗材,加起來就是15公尺,已經遠遠超過鋼材的長度了

由上面的可以知道,3個訂單的組合那就更不行了。

那我們應該如何做到實現這個思路呢,我們有乙個陣列記錄訂單是否選中,請看下面這張圖:

5,6,9初始化的時候,全是未選中的狀態,程式開始執行,先選中5,加上損耗的長度小於12,則繼續選中6,這樣加上損耗的長度大於12了,則設定6的狀態為未選中;接著選中9,5加上9加上損耗的長度,很明顯超過12了,那麼設定9的狀態為未選中;接著從5開始的遍歷完成了,將5的狀態設定為未選中;選中6,再從5開始選中,這樣進行下去。。。。

當然,中間需要有兩個變數記錄最佳長度和最佳訂單組合。

下面附上我的**:

#include /**

* 已知鋼材的總長,訂單數和各訂單需要的長度

* 編制程式從訂單中選擇一組訂單對鋼材作切割加工,

* 使得鋼材得到最佳應用,約定,每次切割損耗

* 固定長度的鋼材

*/#define n 20

#define delta 2

//切割鋼材損耗

/** 最好的長度 **/

int bestlen;

/** 最好長度的選定訂單 **/

int bestsele[n];

/** 選定訂單,用於嘗試選擇 **/

int sele[n];

/** 有n的訂單 **/

int n;

/** 訂單需要的鋼材的長度 **/

int orderlen[n];

/** 鋼材總長度 **/

int total;

void attempt();

int main(void)

printf("\nlength:\n%d",bestlen);

return0;}

void attempt()

//每次嘗試選擇訂單之後,需要將其還原未選中狀態

for(i = 0;i < n;i++)}}

}

鋼材切割問題

已知鋼材的總長,訂單數和各訂單需要的長度編制程式從訂單中選擇一組訂單對鋼材作切割加工,使得鋼材得到最佳應用,約定,每次切割損耗固定長度的鋼材。下面寫一下我的思路,剛開始沒有想明白應該怎麼使用遞迴去做,但是,看了他們的 之後,走了一遍,才明白,其實思路不太好想,但是實現起來還是比較容易的。假設,我們有...

鋼條切割問題

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

光影切割問題

不少人很愛玩遊戲,例如 cs 遊戲設計也成為程式開發的熱點之一,我們假設要設計破舊倉庫之類的場景作為戰爭遊戲的背景。倉庫的地面會因為陽光從屋頂的漏洞或者視窗照射進來而形成許多光照區域和陰影區域。為了簡單起見,假設不同區域的邊界都是直線 我們把這些直線都叫做 光影線 並且不存在三條光影線相交於一點的情...