鋼條切割問題
鋼條切割問題出現在《演算法導論》一書第204頁,作為動態規劃的例題出現,該題內容如下程式第一版程式主要利用動態規劃的方法獲取切取鋼條的最大價值。serling公司購買長鋼條,將其切割為短鋼條**。切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司**一段長為i英吋的鋼條的**為pi(i=1,2,…,單位為美元)。鋼條的長度均為整英吋。圖15-1給出了乙個**表的樣例。
鋼條切割問題是這樣的:給定一段長度為n英吋的鋼條和乙個**表pi(i=1,2,…n),求切割鋼條方案,使得銷售收益rn最大。注意,如果長度為n英吋的鋼條的**pn足夠大,最優解可能就是完全不需要切割。
package com.algorithms.dynamicprogramming;
//初級的鋼條切割問題
public
class cutbar1
r[j] = q;// 儲存子問題的解
}return r[n];// 返回所需解
}public
static
void
main(string args) ;
system.out.println(bottomcutrod(p, 10));}}
程式第二版改進的程式主要是增加了構造乙個最優解的**,在動態規劃的第3個步驟中,是進行自底向上獲得最優解,而通過乙個表的儲存就可以在獲取最優解之後進行自頂向下構造最優解的方案。
package com.algorithms.dynamicprogramming;
//增加最優解構造的鋼條切割問題
public
class cutbar2
}r[j] = q;// 儲存子問題的解
}int nn = n;
while (nn > 0)
return r[n];// 返回所需解
}public
static
void
main(string args) ;
system.out.println(bottomcutrod(p, 10));}}
程式第三版為了將鋼條切割問題和揹包問題結合起來,我對資料進行了改動,鋼條的長度相當於揹包的質量,可切割的鋼條長度相當於可選擇物品的質量,可切割鋼條的價值相當於物品的價值,這裡預設物品的數量無限,01揹包問題在程式第四版中體現。為了讓原題更接近於揹包問題,我把原先具有價值的十個選擇減少到了五個選擇,並對一些**進行改進,最後得到以下的**。
package com.algorithms.dynamicprogramming;
//將鋼條問題完全轉換為揹包問題
public
class cutbar3 ;
private
static
intvalue = ;
private
static
intbottomcutrod(int w)
if (q < value[i] + r[j - weight[i]])
}r[j] = q; // 儲存揹包質量為j時的最大價值
}int w0 = w, k = 1; // 暫存提供揹包質量
while (w0 > 0)
return r[w];// 返回所需解
}public
static
void
main(string args)
}
程式第四版上面的程式是預設物品數量為無限,現在把情況限定為每種質量的物品只有一件,即為01揹包問題,得到程式如下。
package com.algorithms.dynamicprogramming;
//原揹包問題完全轉換為01揹包問題
//源程式以揹包的質量為元,只有揹包的質量是獨一無二的,故為一維問題,此處由於物品的選擇和揹包的質量一樣,是獨一無二的,所以有兩個變數,是二維問題
public
class cutbar4 ;
private
static
intvalue = ;
private
static
intbottomcutrod() }}
return r[n][w];// 返回所需解
}public
static
void
main(string args)
}
程式第五版
package com.algorithms.dynamicprogramming;
//原揹包問題完全轉換為01揹包問題
//源程式以揹包的質量為元,只有揹包的質量是獨一無二的,故為一維問題,此處由於物品的選擇和揹包的質量一樣,是獨一無二的,所以有兩個變數,是二維問題
public
class cutbar5 ;
private
static
intvalue = ;
private
static
intbottomcutrod() }}
}// 二維問題用二元進行控制,自頂向下進行輸出
int n0 = n, w0 = w, k = 1;
while (w0 > 0 && n0 > 0) else
}return r[n][w];// 返回所需解
}public
static
void
main(string args)
}
演算法之動態規劃
一 思想 首先要了解 動態規劃 必須先知道什麼叫做 多階段決策 百科裡面對這個問題解釋的很全,我就load一段出來,大家得要好好品味,好好分析。上面圖中最後一句話就定義了動態規劃是要幹什麼的問題。二 使用規則 現在我們知道動態規劃要解決啥問題了,那麼什麼情況下我們該使用動態規劃呢?最優化原理 最優子...
演算法實驗之動態規劃
設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 輸入結果儲存在1.txt中,輸出結果儲存在2...
動態規劃之LCS演算法
lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。另外還有個分支問題 最長公共子串。子串的字元位置必須連續,而子串行則不必,從原序列中去掉任意的元素獲得的新序列。可以看出,子串...