dalao的揹包模板

2021-08-21 06:06:09 字數 1373 閱讀 4014

01 揹包

有n 種不同的物品,每個物品有兩個屬性,size 體積,value 價值,每種物品只有乙個,現在給乙個容量為 w 的揹包,問最多可帶走多少價值的物品。 

int f[w+1];   //f[x] 表示揹包容量為x 時的最大價值  

for (int i=0; i=size[i]; j--)  

f[j] = max(f[j], f[j-size[i]]+value[i]); //逆序

完全揹包

如果物品不計件數,就是每個物品有無數件的話,稍微改下即可  

1 for (int i=0; i

多重揹包既是每個物體有一定的重量w和價值v,並且有一定的數量cnt,設m為揹包可包含重量;

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int n,m,a[105],num[105],dp[100005];

void comdp(int w,int v)

void zeroone(int w,int v)

void multidp(int w,int v,int cnt)//此時開始多重揹包,dp[i]表示揹包中重量為i時所包含的最大價值

int k=1;//否則進行01揹包轉化,具體由**下數學定理可得

while(k<=cnt)

zeroone(cnt*w,cnt*v);

return ;

}定理:乙個正整數n可以被分解成1,2,4,…,2^(k-1),n-2^k+1(k是滿足n-2^k+1>0的最大整數)的形式,且1~n之內的所有整數均可以唯一表示成1,2,4,…,2^(k-1),n-2^k+1中某幾個數的和的形式。

證明如下:

(1) 數列1,2,4,…,2^(k-1),n-2^k+1中所有元素的和為n,所以若干元素的和的範圍為:[1, n];

(2)如果正整數t<= 2^k – 1,則t一定能用1,2,4,…,2^(k-1)中某幾個數的和表示,這個很容易證明:我們把t的二進位制表示寫出來,很明顯,t可以表示成n=a0*2^0+a1*2^1+…+ak*2^(k-1),其中ak=0或者1,表示t的第ak位二進位制數為0或者1.

(3)如果t>=2^k,設s=n-2^k+1,則t-s<=2^k-1,因而t-s可以表示成1,2,4,…,2^(k-1)中某幾個數的和的形式,進而t可以表示成1,2,4,…,2^(k-1),s中某幾個數的和(加數中一定含有s)的形式。

(證畢!)

01揹包模板 完全揹包 and 多重揹包(模板)

模版就直接貼 01揹包模板 cpp view plain copy print?01揹包問題 01揹包問題的特點是,每種物品僅有一件,可以選擇放或不放。01揹包問題描述 有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量...

01揹包模板 完全揹包 and 多重揹包(模板)

01揹包模板 01揹包問題 01揹包問題的特點是,每種物品僅有一件,可以選擇放或不放。01揹包問題描述 有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。include define n 1050017...

01揹包模板 全然揹包 and 多重揹包(模板)

模版就直接貼 01揹包模板 01揹包問題 01揹包問題的特點是,每種物品僅有一件。能夠選擇放或不放。01揹包問題描寫敘述 有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。include define ...