|
參考 題型範例 - 全國高級中等學校技藝競賽平台 工業類
題目:0-1背包問題 (0-1 Knapsack Problem)
問題描述
一個小偷在商店發現了數種不同的物品,每種物品僅各有一件,並分別有其重量與價值,小偷帶了一個背包,試圖藉由選取物品以獲取最大的價值,但背包有最大的承載量之限制。由於每件物品都不可分割,因此若背包添加一個物品後超過了最大承載量,則該物品必須被捨棄 ( 亦即,每件物品僅能不取或取,此謂之 0-1 )。試設計一個程式,計算其可獲取的最大價值之金額。
$w$:背包的承載量,單位為磅(pound),最大的承載量為磅。
$n$:物品的總數量。
$w_{i}$:代表編號第 i 件物品的重量,單位為磅。
$v_{i}$:代表編號第 i 件物品的價值,單位為元(dollar)。
- 獲取的最大價值的遞迴式 (recurrence) 如下:
- 若 0 或 $w$ = 0 時,總價值 $c[ i,w ] = c[ 0 , x ] = c[ x , 0 ]$。
- 若 $w_i$ > $w$ 時,總價值 $c[ i , w ] = c[ i-1 , w ]$。
- 若 $i > 0$ 及 $w ≥ w_i$ 時,總價值 $c[ i , w ] = max(v_i+c[ i-1 , w - w_i],c[i-1,w]$)。 (例如, $max(a,b)$,即從 $a$ 與 $b$ 兩數中取其最大者)
- 本程式必須以動態規劃 (dynamic programming) 的方法解答。亦即,把一個大問分成多個子問題,先計算各子問題的答案並儲存起來,再結合子問題的答案來計算出此大問題的答案。
- 以二維矩陣的方式,逐漸地增加物品的編號及背包的承載量 $w$,計算並儲存 $c[i,w]$的數值。
- 每件物品的重量與背包的承載量都可被 10 整除。(例如,10, 20, 30, … 等)
輸入說明:
- 背包的最大承載量:$w = 50$。
- 物品的總數量:$n = 3$。
- 各物品的重量與價值:
$w_1 = 20$ , $v_1 = 100$ , $w_2 = 10$ , $v_2 = 60$; $w_1 = 30$ , $v_1 = 120$。
輸出說明:
- 以二維矩陣呈現不同的 $i$ 及 $w$ 值之背包內物品的總價值 $c[i,w]$,其中 $c[n,w]$ 即為獲取的最大價值之金額。
- 輸出格式範例: $c[ 0 \dots n , 0 \dots w]$,其中物品的編號 $i$ 為 0, 1, 2, 3,承載量 $w$ 為 0, 10, 20, 30, 40, 50。
0 0 0 0 0 0
0 x x x x x
0 x x x x x
0 x x x x x
因為題意不夠明確,在不影響題目情況下及方便 judge 系統比對答案,略作補充。
補充資料:
- 第一列輸入背包的最大承載量:$w$。($1\le w\le 10^4$)
- 第二列輸入物品的總數量:$n$。($1\le n\le 100$)
- 第三列輸入 $n$ 個物品重量 $w_i$,每個數值以空白隔開。$1\le w_i\le 100$
- 第四列輸入 $n$ 個物品價值 $v_i$,每個數值以空白隔開。$1\le v_i\le 100$
- 為了對齊方便,輸出格式如下說明:
- 根據 $c[i,w]$ 找出最長位數,以此位數為輸出長度,不足位數前補空白。
- 每個資料間以一個空白隔開。
- 最後一列需列出最大總價值為何?
範例一
範例二
程式碼下載
|