演算法學習(動態規劃 一)鋼條切割

2021-08-03 13:16:20 字數 1397 閱讀 6837

給定一段長度為n的鋼條和乙個**表,求切割鋼條方案,使得銷售收益最大:

**表:

長度i123

4567

8910**p15

891017

1720

2430

經過分析,因為在距離鋼條左端i(i = 1, 2, 3…n)處,總是可以選擇切割或者不切割,因此可得,其共有2n

−1種切割方案,以下是使用自頂向下遞迴實現的**

/**

該方法使用窮舉統計,將所有的情況全部統計得出最優解

@param prices 給定的價目陣列

@param index 獲取當前位置的最優解

@return 返回給定位置的最優解

*/int exhaustionstatistics (int *prices, int index)

return result;

}

經過測試,如果輸入的規模變大,則會導致程式執行時間變得很長,這是因為此函式考察了所有的可能,因此,規模的增大是的執行時間呈指數增長

/**

求解最優解問題

@param prices 給定的價目陣列

@param index 獲取當前長度的最優解

@return 返回最優解

*/int advanced::memoizedcutpod(int *prices, int index)

/** 根據備忘錄自頂向下來求解最優解

@param prices 給定的價目陣列

@param index 獲取當前長度最優解

@param memo 儲存各個長度最優解的備忘錄

@return 返回最優解

*/int advanced::memoizedcutpodaux(int *prices, int index, int *memo)

}//todo: 5.求出後記錄在備忘錄中

memo[index - 1] = result;

return result;

}

另一種是自底向上法,任何子問題的求解都依賴於更小的子問題,按照規模排序,當求解某個子問題時,它所依賴的更小的子問題已經求解完畢,結果已經儲存:

/**

自底向上求解最優解

@param prices 給定的價目陣列

@param index 獲取當前長度的最優解

@return 返回最優解

*/int advanced::bottomupcutrod(int *prices, int index)

//todo: 4.將最優解儲存入陣列

memo[j] = result;

}return memo[index];

}

動態規劃(一)鋼條切割

什麼是動態規劃 答 動態規劃與分治法相似,都是通過組合子問題的解來求解原問題。他們之間的不同是,分治法將問題劃分為互不相交的子問題,而動態規劃應用於子問題重合的情況。使用分治法求解子問題重合的問題,會做許多不必要的工作,動態規劃將已經求解的子問題儲存到一張 中,從而避免了反覆求解重合子問題的情況。動...

演算法學習 鋼條切割

鋼條切割問題 serling公司購買長鋼條,將其切割為短鋼條 切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司 一段長為i英吋的鋼條的 為pi i 1,2,單位為美元 鋼條的長度均為整英吋。圖15 1給出了乙個 表的樣例。鋼條切割問題是這樣的 給定一段長度為...

動態規劃 鋼條切割

一家公司購買長鋼條,將其切割成短鋼條 切割本身沒有成本,長度為i的短鋼條的 為pi。那給定一段長度為n的鋼條和乙個 表pi,求鋼條的切割方案使得收益rn最大。如乙個pi如下 長度i12 3456 78910 pi15 891017 1720 2430 在距離鋼條左端i長度處,我們總是可以選擇切割或者...