揹包問題之多重揹包

2022-08-17 07:03:11 字數 1446 閱讀 3664

其實感覺多重揹包比01揹包和完全揹包都要難,每件物品的數量可能不止一件,還是求放入揹包的物品的最大價值。

在揹包九講中,給出的動態轉移方程為:

f[i][v]=max

但是感覺還是考慮邊界問題比較煩人,所以我想的是把多重揹包和之前的01揹包聯絡起來......不知道行不行

這裡我寫了一種一維dp陣列的寫法,在這題測試是tle的,因為這題的資料量太大,怎麼解決後面再說......

1 #include 2 #include 3 #include 4

5using

namespace

std;67

int a[10];8

int w[10]=;

9double v[10]=;

10double dp[10005

];11

//double dp[15][10005];

1213

intmain()

1436

*/37 printf("

$%.2lf\n

", dp[m]);

38//

printf("$%.2lf\n", dp[n][m]);39}

40return0;

41 }

看注釋那一行就相當於把相同的這幾件物品分成一件件,然後套用01揹包的方法來解決!

那要怎麼解決超時問題呢?

用到了二進位制劃分的辦法,分成1,2,4,8,16...64.....(剩下的)

假如物品有12件,就分成1,2,4,5(這裡的5就是剩下的),這樣,如果我想拿7件,就用1+2+4來湊就好了,只用遍歷3次,而不是7次!省了好多時間!

最後還是用01揹包解決!

1 #include 2 #include 3 #include 4

5using

namespace

std;67

int a[15];8

double dp[15000];9

int weight[15]=;

10double value[15]=;

11int w[15000

];12

double v[15000

];13

14int

main()

1533

if(a[i] > 0)34

38}39for(int i = 0; i < count; ++i) //

使用01揹包

40for(int j = m; j >= w[i]; j--)

41 dp[j] = max(dp[j-w[i]]+v[i], dp[j]);

42 printf("

$%.2lf\n

",dp[m]);

43}

44return0;

45 }

揹包問題之多重揹包

相比完全揹包問題,多重揹包指定物品個數。我們可以將多重揹包問題轉化為0 1揹包 容易超時,優化後續補充 進行處理。求最好價值問題的多重揹包不能使用記錄使用物品次數的方式進行簡化 題目給定一些不同價值的硬幣,求這些硬幣可以組成1 n範圍內值的數量。public int backpack int n,i...

揹包問題之多重揹包問題

問題描述 有n個物品,第i個物品的重量與價值分別為 w i w i w i 與 v i v i v i 且第i種物品最多有p i 件。揹包容量為v,試問在每個物品不超過其上限的件數 物品必須保持完整 的情況下,如何讓揹包裝入的物品具有更大的價值總和。現有資料如下 w 2 3,4 5 v 3,4,5,...

dp 揹包之多重揹包

問題 多重揹包也是 0 1 揹包的乙個變式。與 0 1 揹包的區別在於每種物品有ki個,而非乙個。解決方案 將k個相同的物品,看作k個不同的物品,但是wi,ci都一樣。即可套用 01揹包方案 詳見 優化方法 二進位制優化 設k個物品分成 a xx a xx 1 a xx k 1 個物品。那麼 a x...