python多重揹包 多重揹包

2021-10-21 05:14:57 字數 1853 閱讀 2828

多重揹包問題ⅰ

有 n 種物品和乙個容量是 v 的揹包。

第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。

輸出最大價值。

資料範圍:

0< n , v ≤100

0< vi , wi , si ≤100

//樸素版多重揹包問題≈樸素版完全揹包問題,只不過加了物品數量的限定條件

#include

#include

using namespace std;

const int n=110;

int n,m;

int s[n],w[n],v[n];

int dp[n][n];

int main()

cin>>n>>m;

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

cin>>v[i]>>w[i]>>s[i];

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

for(int j=0;j<=m;j++)

for(int k=0;k<=s[i]&&k*v[i]<=j;k++)

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

cout<

return 0;

多重揹包問題ⅱ

資料範圍:

0< n ≤1000

0< v ≤2000

0< vi , wi , si ≤2000

最主要的思想是二進位制優化,把問題轉化為01揹包問題

int k=1;

while(k<=s)//類似於將s[i]=16,拆成一堆二進位制後1 2 4 8 1,與體積,質量乘積打包成乙份乙份

cnt++;

v[cnt]=a*k;

w[cnt]=b*k;

s-=k;

k*=2;

//如果s[i]沒用連續的二進位制打包完

if(s>0)

cnt++;

v[cnt]=a*s;

w[cnt]=b*s;

n=cnt;//這是新的物品數量

#include

#include

#include

using namespace std;

const int n=12010;

int dp[n];

int v[n],w[n];

int n,m;

int main()

cin>>n>>m;

int cnt=0;

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

int a,b,s;

cin>>a>>b>>s;

//對每個s[i]二進位制打包

int k=1;

while(k<=s)//類似於將s[i]=16,拆成一堆二進位制後1 2 4 8 1,與體積,質量乘積打包成乙份乙份

cnt++;

v[cnt]=a*k;

w[cnt]=b*k;

s-=k;

k*=2;

//如果s[i]沒用連續的二進位制打包完

if(s>0)

cnt++;

v[cnt]=a*s;

w[cnt]=b*s;

n=cnt;//這是新的物品數量

//因為經過上述操作後,每個物品的數量都來變成了1,於是轉變成01揹包問題,o(nvlogs)

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

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

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

cout<

return 0;

多維多重揹包問題 01揹包,完全揹包,多重揹包

csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...