【題目描述】
設有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個物品的數量,解可以表示為。那麼目標函式和約束...