【問題描述】
"找啊找啊找gf,找到乙個好gf,吃頓飯啊拉拉手,你是我的好gf.再見."
"誒,別再見啊..."
七夕...七夕...七夕這個日子,對於sqybi這種單身的菜鳥來說是多麼的痛苦...雖然他聽著這首叫做"找啊找啊找gf"的歌,他還是很痛苦.為了避免這種痛苦,sqybi決定要給自己找點事情幹.他去找到了七夕模擬賽的負責人zmc mm,讓她給自己乙個出題的任務.經過幾天的死纏爛打,zmc mm終於同意了.
但是,拿到這個任務的sqybi發現,原來出題比單身更讓人感到無聊-_-....所以,他決定了,要在出題的同時去辦另一件能夠使自己不無聊的事情--給自己找gf.
sqybi現在看中了n個mm,我們不妨把她們編號1到n.請mm吃飯是要花錢的,我們假設請i號mm吃飯要花rmb[i]塊大洋.而希望騙mm當自己gf是要費人品的,我們假設請第i號mm吃飯試圖讓她當自己gf的行為(不妨稱作泡該mm)要耗費rp[i]的人品.而對於每乙個mm來說,sqybi都有乙個對應的搞定她的時間,對於第i個mm來說叫做time[i]. sqybi保證自己有足夠的魅力用time[i]的時間搞定第i個mm^_^.
sqybi希望搞到盡量多的mm當自己的gf,這點是毋庸置疑的.但他不希望為此花費太多的時間(畢竟七夕賽的題目還沒出),所以他希望在保證搞到mm數量最多的情況下花費的總時間最少.
sqybi現在有m塊大洋,他也通過一段時間的努力攢到了r的人品(這次為模擬賽出題也攢rp哦~~).他憑藉這些大洋和人品可以泡到一些mm.他想知道,自己泡到最多的mm花費的最少時間是多少.
注意sqybi在乙個時刻只能去泡乙個mm--如果同時泡兩個或以上的mm的話,她們會打起來的...
【輸入檔案】
輸入的第一行是n,表示sqybi看中的mm數量.
接下來有n行,依次表示編號為1, 2, 3, ..., n的乙個mm的資訊.每行表示乙個mm的資訊,有三個整數:rmb, rp和time.
最後一行有兩個整數,分別為m和r.
【輸出檔案】
你只需要輸出一行,其中有乙個整數,表示sqybi在保證mm數量的情況下花費的最少總時間是多少.
【輸入樣例】 4
1 2 5
2 1 6
2 2 2
2 2 3
5 5【輸出樣例】 13
【資料規模】
對於20%資料,1<=n<=10;
對於100%資料,1<=rmb<=100,1<=rp<=100,1<=time<=1000;
對於100%資料,1<=m<=100,1<=r<=100,1<=n<=100.
【提交鏈結】
【問題分析】
初看問題覺得條件太多,理不出頭緒來,所以要將問題簡化,看能否找出熟悉的模型來,如果我們只考慮錢夠不夠,或只考慮rp夠不夠。並且不考慮花費的時間。這樣原問題可以簡化成下面的問題:
在給定m元rmb(或r單位rp,rp該用什麼單位呢?汗。。。)的前題下,去泡足夠多的mm,很顯然這個問題就是典型的0/1揹包問題了。
可以把泡mm用的rmb(或rp看做重量),泡到mm的個數看做價值,給定的m(或r)就是揹包的載重。求解這個問題很輕鬆嘍。
但是,這個問題既要考慮rmb有要考慮rp怎麼辦呢?
解決這個問題很容易啊,要是你有足夠的rmb去泡第i個mm而rp不夠就泡不成了,要是rp夠就可以。也就是在原來問題的基礎上在狀態加一維。
那要是在考慮上時間最小怎麼辦呢?
這個也很好說,在求解過程中如果花x元rmp,y單位rp可以到z個mm,那麼在泡第i個mm時,發現可以用x-rmb[i]元,y-rp[i]單位rp泡到的mm數加上這個mm(也就是+1)比原來z多,就替換它(因為你的原則是盡量多的泡mm),如果和z一樣多,這是就要考慮原來花的時間多呢,還是現在花的時間多。要是原來的多,就把時間替換成現在用的時間(因為你既然可以泡到相同數量的mm當然要省點時間去出題)。
設計乙個二維狀態opt[j,k]表示正好花j元rmp,k單位rp可以泡到的最多的mm的數量。增加乙個輔助的狀態ct[k,j]表示正好花j元rmp,k單位rp可以泡到的最多mm的情況下花費的最少的時間。
邊界條件 opt[0,0]=1 (按題意應該是0,但為了標記花費是否正好設為1,這樣,opt[j,k]>0說明花費正好)
狀態轉移方程:
opt[j,k]=max
(rmb[i]<=j<=m,rp[i]<=k<=r,00)
ct[j,k]:=min+time[i] (opt[j,k]=opt[j-rmb[i],k-rp[i]]+1)
時間複雜度:
階段數 o(n)*狀態數o(mr)*轉移代價o(1)= o(nmr)
注:資料挺小的。
問題拓展:
如果要加入別的條件,比如泡mm還要一定的sp,等也就是說乙個價值要不同的條件確定,那麼這個問題的狀態就需要在加一維,多乙個條件就多一維。
#include#include#includeusing namespace std;
int n, rmb, rp;
int g[101][3];
int dp[101][101][101];
int t[101][101][101];
int main()
if(dp[i-1][j][k] > dp[i-1][j-g[i][0]][k-g[i][1]] + 1)
else if(dp[i-1][j][k] < dp[i-1][j-g[i][0]][k-g[i][1]] + 1)
else if(t[i-1][j][k] > t[i-1][j-g[i][0]][k-g[i][1]] + g[i][2])
else}}
}printf("%d\n",t[n][rmb][rp]);
}return 0;
}
優化一下:
#include#include#includeusing namespace std;
int n, rmb, rp;
int g[101][3];
int dp[101][101];
int t[101][101];
int main()
if(dp[j][k] == dp[j-g[i][0]][k-g[i][1]] + 1 && t[j][k] > t[j-g[i][0]][k-g[i][1]] + g[i][2])}}
}printf("%d\n",t[rmb][rp]);
}return 0;
}
DP luogu 找啊找啊找GF
找啊找啊找gf,找到乙個好gf,吃頓飯啊拉拉手,你是我的好gf.再見.誒,別再見啊.七夕.七夕.七夕這個日子,對於sqybi這種單身的菜鳥來說是多麼的痛苦.雖然他聽著這首叫做 找啊找啊找gf 的歌,他還是很痛苦.為了避免這種痛苦,sqybi決定要給自己找點事情幹.他去找到了七夕模擬賽的負責人zmc ...
洛谷1509 找啊找啊找GF
找啊找啊找gf,找到乙個好gf,吃頓飯啊拉拉手,你是我的好gf.再見.誒,別再見啊.七夕.七夕.七夕這個日子,對於sqybi這種單身的菜鳥來說是多麼的痛苦.雖然他聽著這首叫做 找啊找啊找gf 的歌,他還是很痛苦.為了避免這種痛苦,sqybi決定要給自己找點事情幹.他去找到了七夕模擬賽的負責人zmc ...
P1509 找啊找啊找GF(洛谷)
找啊找啊找gf,找到乙個好gf,吃頓飯啊拉拉手,你是我的好gf.再見.誒,別再見啊.七夕.七夕.七夕這個日子,對於sqybi這種單身的菜鳥來說是多麼的痛苦.雖然他聽著這首叫做 找啊找啊找gf 的歌,他還是很痛苦.為了避免這種痛苦,sqybi決定要給自己找點事情幹.他去找到了七夕模擬賽的負責人zmc ...