1268 例9 12 完全揹包問題

2021-09-28 11:19:29 字數 1259 閱讀 1922

【題目描述】

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件(同一種物品可以多次選取),使其重量的和小於等於m,而價值的和為最大。

【輸入】

第一行:兩個整數,m(揹包容量,m≤200)和n(物品數量,n≤30);

第2…n+1行:每行二個整數wi,ci,表示每個物品的重量和價值。

【輸出】

僅一行,乙個數,表示最大總價值。

【輸入樣例】

10 4

2 13 3

4 57 9

【輸出樣例】

max=12

【**】

no

#include

#include

#include

#include

const

int maxn =

205;

using

namespace std;

int w[maxn]

,c[maxn]

,dp[maxn]

;int

main()

} cout<<

"max="

<;return0;

}

完全揹包模板題,和01揹包的卻別就是乙個是順序取,乙個是逆序取。

比如取第i個物品時

01揹包是每一樣只能取乙個,所以取的時候考慮的是i-1的情況

完全揹包是每一樣都能無限取,所以考慮的i的情況

這兩種不同的考慮就決定你滾動陣列的取值順序

01揹包

1.dp[i-1][v] 不取i

2.dp[i-1][v-w[i]]+c[i] 取i

因為v > v-w[i] 你考慮的是i-1的情況,所以i-1前面的值是一定不能變的,簡單點說i的情況只和i的正上方和左上方有關(i-1),因為是一維陣列,後面的不影響前面的,後面更新的是i的情況

完全揹包

1.dp[i-1][v] 不取i

2.dp[i][v-w[i]]+c[i] 取i

和01差不都,關鍵是取i的時候不一樣,因為轉換到一直取i的情況,而i的情況只和正上方和他自己這行的左邊有關,你只有先把自己的左邊求了才能從左往右求,

我這沒有,演算法筆記p446頁有,一目了然

總之,01揹包是根據i-1行的左側從右向左把i-1跟新成i

完全揹包則是根據自己的這一行從左往右生成i的 ( 正上方的i-1)

1268 例9 12 完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 同一種物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2 n 1行 每行二個整數wi,c...

ybt1268 完全揹包

時空限制 1000ms 64mb 設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 同一種物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第...

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...