找啊找啊找GF (多維動態規劃)

2021-06-08 05:58:09 字數 3165 閱讀 2189

【問題描述】

"找啊找啊找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 ...