【問題描述】
小z準備舉辦乙個比賽。他需要提供一些甜點給參賽者來補充能量。每種甜品有一定的能量ti和大小ui,且每種甜點最多有vi個。
小z準備用箱子來包裝甜點。箱子可以容納一定體積的甜點且需要一定的費用。小z有一種魔法,可以將乙個甜點分成多份裝在箱子裡,最後再合在一起(但合成之後必須是完整的乙個)。
小z想知道準備能量至少為p的甜點的最小大小和最少需要多少費用來購買箱子,如果最少費用超過小z所擁有的錢數k則輸出fail。
【輸入格式】
第一行為4個正整數n,m,p, k( 1 ≤ n ≤ 200,1 ≤ m ≤ 200,0 ≤ p ≤ 50000, k <= 50000)分別代表甜點種類,箱子種類和參賽者比賽所需要補充的能量和小z所擁有的錢數。
接下來的n行,每行包含3個整數ti, ui, vi ( 1 ≤ ti ≤ 100,1 ≤ ui ≤ 100,1 ≤ vi ≤ 100) , 代表第i類甜點可以提供ti的能量,它的大小為ui並且小明最多有vi個該種類的甜點。
接下來又有m行,每一行包含3個整數xi, yi, zi ( 1 ≤ xj ≤ 100,1 ≤ yj ≤ 100,1 ≤ zj ≤ 100), 代表第i類箱子可以容納xi大小的甜點,該類箱子的單價yi,並且小z最多可以使用zi個該類的箱子。
【輸出格式】
第一行請輸出最小的甜點大小。
第二行請輸出最小的箱子費用,並且費用不能超過k。否則,輸出fail。
【樣例輸入】
5 3 34 34
1 4 1
9 4 2
5 3 3
1 3 3
5 3 2
3 4 5
6 7 5
5 3 8
【樣例輸出】
1912
【資料範圍與約定】
30%: n, m <= 15, p, k <= 1000
60%: n, m <= 50, p, k <= 5000
100%: n, m <= 200, p <= 50000, k <= 50000
[測試資料](
題解:首先,我們可以以每個甜點的能量為價值,體積為費用,建立乙個多重揹包問題。
由於資料有點大,我們可以選擇二進位制優化或者單調佇列優化。
然後,我們從體積從小到大遍歷一邊,直到找到了乙個能量大於需求,記錄下來這個體積。
然後我們以箱子的體積為價值,費用為費用,跑一邊多重揹包。
費用從小到k遍歷一邊,找到第乙個價值大於體積的費用,記錄下來這個費用。如果最終沒有找到,那麼輸出fail。
**如下
1 #include2 #include3 #include4const
int maxn = 300;5
intn,m,p,k,t[maxn],u[maxn],v[maxn],x[maxn],y[maxn],z[maxn];
6struct
node p[30000];9
int a[100002],b[100002],tot=0
;10 inline void devide(int
x) 18
if(v[x])
22return;23
}24 inline void devide2(int
x) 32
if(z[x])
36return;37
}38intmain() 50}
51int
ans1;
52for(register int i=1;i<=100000;i++) 58}
59 tot=0;60
for(register int i=1;i<=m;i++) devide2(i);
61for(register int i=1;i<=tot;i++) 65}
66for(register int i=1;i<=k;i++) 71}
72 puts("
fail");
73return0;
74 }
python多重揹包 多重揹包
多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...
多維多重揹包問題 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 轉化...