【問題描述】
給定n個物品,每個物品可以不選或選乙個,第i個物品的**為ci,價值為vi,出現時間為ti。有m個詢問,每次詢問在出現時間不超過ti的所有物品中選若干件,總花費不超過mi的情況下,被選擇物品的價值和的最大值是多少。
【輸入格式】
第一行輸入n,m。
接下來n行每行3個整數表示ci,vi,ti.
接下來m行詢問每行2個整數表示ti,mi.
【輸出格式】
輸出m行,每行乙個整數表示第i個詢問的答案。
【樣例輸入】
5 23 6 1
5 7 4
8 2 9
10 1 7
3 3 4
9 50
4 30
【樣例輸出】
【資料規模】
%30:n≤10,m≤20; ci,vi,ti≤20,mi≤1000
%60:n≤100,m≤1000; ci,mi≤100000,vi≤100,ti<=300
%100: n≤300,m≤100000; ci,mi≤10^9,vi≤300,ti<=300
【分析】另類揹包+單調優化
先將物品時間公升序排列,首先想到01揹包,但c和m太大無法承受。
考慮到vi很小:記f[i,j]為1..i件物品選出j的價值和的最小花費,o(n^3),空間剛好足夠。
對於乙個詢問的答案就是:
1、算出在ti時間內所能購買的物品範圍[1,x]
2、答案就是滿足f[x,j]≤mi的最大j
暴力處理詢問的話依然會tle
於是二分:
記g[x,j]為f[x,j…]的最小值,這樣g[x]就是單調增的
答案就是滿足g[x,j]≤mi的最大j
本人總結:
一般的揹包我們求最大值所以我們的初值可以放心的設定為0
因為即使不能恰好湊到那個數目
我們可以以非0的容量為起點恰好湊到這個數目
但是如果我們改變狀態求達到某個價值的容量最小值
我們明顯不能湊到的地方始終都會是最大值
顯然我們要求到乙個價值的容量最小值
其實也就包含了更大的價值的最小值
有可能這個價值不能被恰好湊到,這就是取min的特點
但相對於能湊到更大的價值用更小的空間,我們可以理解成拋棄掉這麼多空間來更新
所以我們這種情況下一定用原來的方法更新完之後要從後往前取保證單調性
因為我們不能從比自己小的價值的最小容量轉移過來,所以只能從後面轉移過來了
在這道題目裡面我們求某價值的最小容量
我們在查詢的之後最小容量相同的情況下我們會找到最大的價值,所以不會漏解
也就是找到剛好湊到的價值
從後往前取min保證二分可以順利進行,這就是意義所在
code:
1 #include2 #include3 #include4 #include5#define n 1000006
6using
namespace
std;
7struct
node s[n];
10bool cmp(const node&a,const node&b)
1314
long
long time[n],f[301][90002
],maxval;
15long
long
n,m;
16long
long find(long
long
judge)
23return
r;24}25
long
long find(long
long x,long
long
judge)
32return
r;33}34
long
long
read()
41while
(isdigit(c))
45return x*f;46}
47int
main()
53 sort(s+1,s+n+1
,cmp);
54for(long
long i=1; i<=n; i++)time[i]=s[i].t;
55 memset(f,0x3f3f3f3f,sizeof
f);56 f[0][0]=0;57
for(long
long i=1; i<=n; i++) 62}
63for(long
long i=1; i<=n; i++) 67}
68for(long
long i=1; i<=m; i++)
73return0;
74}7576
//bag
over
揹包九講(5)
問題二維費用的揹包問題是指 對於每件物品,具有兩種不同的費用 選擇這件物品必須同時付出這兩種代價 對於每種代價都有乙個可付出的最大值 揹包容量 問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a i 和b i 兩種代價可付出的最大值 兩種揹包容量 分...
T1270 例9 14 混合揹包
題目描述 乙個旅行者有乙個最多能裝v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wnw1,w2,wn,它們的價值分別為c1,c2,cnc1,c2,cn。有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 求解將哪些物品裝入揹包可使這些...
蘋果(01揹包題目5)
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...