混合揹包問題

2021-08-04 12:16:02 字數 2434 閱讀 4392

/* 

name: 混合揹包問題

author: 巧若拙

date: 07-06-18 09:33

description:

混合揹包問題 :在n種物品中選取若干件放在容量為c的揹包裡,分別用p[i]和w[i]儲存第i種物品的價值和重量。

有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)

求解怎麼裝物品可使揹包裡物品總價值最大。

輸入 第一行2個數n和c,表示共有n種物品,揹包總容量為c

接下來n行,每行3個數wi,pi和ni,分別表示第i種物品的重量,價值和最大數量(若ni=0,則表示此物品可取無限次)

輸出 乙個整數,表示揹包裡物品最大總價值

樣例輸入

3 10

2 1 0

3 3 1

4 5 4

樣例輸出

11

演算法分析:

考慮到0-1揹包是多重揹包問題的乙個特例,所以混合揹包問題可以分為完全揹包和多重揹包兩種情況分析。

只需要判斷ni的值,然後分別使用完全揹包和多重揹包的演算法來寫**就行了。

我們可以用2個一維陣列記錄最優解,也可以進一步優化,使用1個一維陣列記錄最優解。

因為即使是完全揹包問題,實際上選擇物品的數量也是有限的,

因此全部當作多重揹包來解,**結構更簡潔,但是因為使用了三重迴圈,完全揹包的效率降低。

*/

#include#includeusing namespace std;

const int maxc = 6000; //揹包最大容量

const int maxn = 2000; //物品的個數

int w[maxn+1];//物品的重量

int p[maxn+1];//物品的價值

int n[maxn+1];//物品的最大數量

int pre[maxc+1]; //pre[j]相當於b[i-1][j]

int cur[maxc+1]; //cur[j]相當於b[i][j]

int f[maxc+1]; //記錄裝入容量為c的揹包的最大價值

int f2[maxc+1]; //記錄裝入容量為c的揹包的最大價值

int f3[maxc+1]; //記錄裝入容量為c的揹包的最大價值

int mixpack_1(int n, int c);//混合揹包問題:2個一維陣列記錄最優解

int mixpack_2(int n, int c);//混合揹包問題:一維陣列記錄最優解

int mixpack_3(int n, int c);//混合揹包問題:全部當作多重揹包來解,**結構更簡潔,但是完全揹包的效率降低

int mixpack_4(int n, int c);//混合揹包問題:全部當作多重揹包來解,使用了樸素的窮舉演算法

int main()

cout << mixpack_1(n, c) << endl;

cout << mixpack_2(n, c) << endl;

cout << mixpack_3(n, c) << endl;

cout << mixpack_4(n, c) << endl;

return 0;

} int mixpack_1(int n, int c)//混合揹包問題:2個一維陣列記錄最優解

for (int j=1; j<=c; j++)

} else //多重揹包(包含0-1揹包)

for (int j=1; j<=c; j++)

} }

} return pre[c];

}

int mixpack_2(int n, int c)//混合揹包問題:1個一維陣列記錄最優解

} else //多重揹包(包含0-1揹包)

} }

} return f[c];

} int mixpack_3(int n, int c)//混合揹包問題:全部當作多重揹包來解,**結構更簡潔,但是完全揹包的效率降低

for (int k=maxnum; k>0; k--)//對第i種物品進行maxnum次0-1選擇

} }

return f2[c];

} int mixpack_4(int n, int c)//混合揹包問題:全部當作多重揹包來解,使用了樸素的窮舉演算法

for (int k=maxnum; k>0; k--)

} if (f3[j] < bestp) //有更好的解才更新

f3[j] = bestp;

} }

return f3[c];

}

混合揹包問題

如果將p01 p02 p03混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?考慮到在p01和p02中給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物...

混合揹包問題

有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩...

混合揹包問題

題面連線 題面有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 每種體積是 vi 價值是 wi 求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩個整數,n,vn,v,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 ...