/*
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 行,每行三個整數 ...