動態規劃4 多重揹包

2021-08-22 07:24:04 字數 1828 閱讀 9967

1.這裡區別一下三種揹包:

(1)01揹包:揹包有最大容量c,給出n種物品,每種物品僅僅乙個,有自己的重量和價值wi和vi,求揹包可裝下的最大價值

(2)完全揹包:揹包有最大容量c,給出n種物品,每種物品無限個,有自己的重量和價值wi和vi,求揹包可裝下的最大價值

(3)多重揹包:揹包有最大容量c,給出n種物品,每種物品給出數量m,有自己的重量和價值wi和vi,求揹包可裝下的最大價值

2.多重揹包解決方法:

對於多重揹包我們完全可以把他轉化為01揹包,每一種都分成乙個個的來當做01揹包處理,但是乙個個分的話效率太低,這裡考慮二進位制處理。這裡引入兩個定理:

(1)任何乙個數字n都可以拆為 1 + 2^1 + 2^2 + 2^3 + ...... + 2^k + (n - 2^k) 的形式

(2)1 , 2^1 , 2^2 , 2^3 , ....,2^k 可以組合為1 - n之間的任意乙個數字

有了以上兩條性質我們就不用把每個物品的數量拆成乙個乙個的了,我們可以拆成2^k , 不僅加快了效率而且這些數字也可以組合為 1 - n間的任意乙個數字表示任意乙個數量,兩全其美。

int k = 1;

while(k3.板子:

(1)若w * k >= c(該物品總重量》=揹包總重):可以看作為完全揹包處理

(2)若w * k < c  : 當做01揹包處理

#include #include#include#include#includeusing namespace std;

const int maxn = 10000 + 5;

int best[maxn];

int n,c;

void completepack(int w,int v)//完全揹包(順序)

}void zeroonepack(int w,int v)//01揹包(逆序)

}void multiplepack(int w,int v,int m)

int k = 1;//分解為01揹包(二進位制拆分)

while(k4.例題 

(1) hdu - 2844 coins

題意:給你n個錢幣的數量和價值, 給你乙個m ,讓求這些錢幣能組合成多少種不同的<=m的價值。注意:這裡要求支付價錢時,組合是正好的不用找零!

分析:乍一眼以為要從規劃數量入手,那樣就用不上條件了。其實留意一下題意裡的注意,我們還是dp每種**下最大的組合價值,如果這個是一種組合方式的話 dp[i] == i 了(因為dp[i]為<=i的最大價值),所以我們dp以後在查詢一下有多少dp[i] == i即可!注意這裡錢幣的重量 = 錢幣的價值。

**:#include #include#include#include#includeusing namespace std;

const int maxn = 100 + 10;

int w[maxn],v[maxn];

int dp[maxn*1000];

int n,m;

void completepack(int w,int v)

}void zeroonepack(int w,int v)

}void multiplepack(int wi,int vi)

int k = 1;

while(kzeroonepack(wi*vi,vi*wi);

return;

}int main()

for(int j = 0;jfor(int i = 0;iint cnt = 0;

//cout

printf("%d\n",cnt);

}return 0;

}

動態規劃 多重揹包

動態規劃 多重揹包 時間限制 1 sec 記憶體限制 64 mb 提交 5 解決 5 提交 狀態 討論版 張琪曼 魔法石礦裡每種魔法石的數量看起來是足夠多,但其實每種魔法石的數量是有限的。李旭琳 所以我們需要改變裝包策略啦。現有n n 10 種魔法石和乙個容量為v 0第一行為兩個數字,即v和n。以下...

動態規劃 多重揹包

概念 多重揹包 有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,並且價值總和最大。這類問題即為多重揹包問題。把多重揹包當成01揹包 我們樸素的想法就是,對於某一種物品,我們看取乙個的時候,跑一...

動態規劃 多重揹包問題

有 n 種物品和乙個容量為 w 的揹包,每種物品都有無限件可用。第 i 種物品的重量是 w i 價值是 v i 最多有 s i 件 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。第一行兩個整數,n 和 v 用空格隔開,分別表示物品總數和揹包的容積 接下來有 n 行。每行...