dp2之多重揹包

2021-08-06 05:41:48 字數 1875 閱讀 2298

沉浸在揹包的世界裡不能自拔…

多重揹包在完全揹包的基礎上公升級為每個種類的東西的數目是有限的

☝多重揹包裸題

ac**

#include

using

namespace

std;

#include

#include

int main()

if (c[i] > 0)

}/*for (i = 1; i < index; i++)

cout << v[i] << " " << w[i] << endl;*/

for (i = 1; i < index; i++)

for (j = n; j >= v[i]; j--)

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

cout

<< dp[n] << endl;

}return

0;}

下面我來說一下我對多重揹包的理解,time to 胡言亂語。

這是將多重揹包拆分後的相當於p,w的陣列的結果。

行吧…我還不是很懂。

雖然不懂,但是也要記錄一下自己的想法,就大概的意思就是想要把n[i]個物品拆分掉,最簡單的方法就是把它拆分成n[i]個物品,相當於01揹包,但是這樣就是三重迴圈,一旦數目變大就會超時,所以就想到了二進位制拆分,但是我覺得這樣子拆分就像上面跑出來的程式一樣,會不會出現那種不是一下子拿走係數個,而是只拿乙個是最優解的情況呢,所以我決定去胡謅乙個資料試試

這是打通我任督二脈的兩組資料,突然一下子就懂了,按照這個方法拆分,總是可以湊出1~n[i],這之間的每乙個數字,所以無論取幾個成為最優解,都是不會遺漏的,動態規劃的意義也就在這裡!要說一下的就是上面第一組資料中的13是1and2and4and8(不可以)and6,6不是和1、2、4一起的!

這個多重揹包問題的模板真的好厲害,完全融會貫通01揹包和完全揹包!

多重揹包問題的模板

#include

#include

#include

#include

#include

#include

using

namespace

std;

int c[105],w[105],num[105];

int dp[105];

int v,v,v1;

void zeroonepack(int c, int w)

} void completepack(int c, int w)

} void multiplepack(int c, int w, int num)

//如果總容量比這個物品的容量小,那麼這個物品相當於取不完,那就是完全揹包問題

else

//否則就要轉化成01揹包

zeroonepack(num*c, num*w);

} } int main()

memset(dp,0,sizeof(dp));

for(i = 1; i <= n; i++)

printf("%d\n",dp[v]);

} return

0;

}

非常強!

DP之多重揹包

description 給定n種物品和乙個容量為c的揹包,第i種物品最多有mi件可用,每件的重量是wi,價值是vi。問 將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。input 輸入的第一行為測試樣例的個數t,接下來有t個測試樣例。每個測試樣例的第一行是物品種數n 1 n ...

dp 揹包之多重揹包

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

揹包問題之多重揹包

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