1. 程式人生 > >P1509 找啊找啊找GF(洛谷)

P1509 找啊找啊找GF(洛谷)

題目背景

"找啊找啊找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數量的情況下花費的最少總時間是多少.

輸入輸出樣例

輸入樣例#1:
4
1 2 5
2 1 6
2 2 2
2 2 3
5 5
輸出樣例#1:
13

說明

sqybi說:如果題目裡說的都是真的就好了...

sqybi還說,如果他沒有能力泡到任何一個MM,那麼他就不消耗時間了(也就是消耗的時間為0),他要用這些時間出七夕比賽的題來攢rp...

資料規模

對於20%資料,1<=n<=10;

對於100%資料,1<=rmb<=100,1<=rp<=100,1<=time<=1000;

對於100%資料,1<=m<=100,1<=r<=100,1<=n<=100

程式碼:

這題應該算是二維費用揹包的升級版,既要保證mm的數量又要求時間最短,所以要開兩個二維陣列。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,r;
int rmb[110],rp[110],t[110];
int f[110][110],h[110][110];//f記錄最優mm數量,h記錄最優時間
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d%d%d",&rmb[i],&rp[i],&t[i]);
	scanf("%d%d",&m,&r);
	memset(f,0,sizeof(f));
	memset(h,0,sizeof(h));//注意雖然是求最少時間,但要把初值賦為0,因為下面相加的時候是從0開始加的;
	for(int i=1;i<=n;i++)
	for(int j=m;j>=rmb[i];j--)
	for(int k=r;k>=rp[i];k--)
	{
		if((f[j-rmb[i]][k-rp[i]]+1)>f[j][k])
		{f[j][k]=f[j-rmb[i]][k-rp[i]]+1;
		h[j][k]=h[j-rmb[i]][k-rp[i]]+t[i];
		}
	if((f[j-rmb[i]][k-rp[i]]+1)==f[j][k]&&(h[j-rmb[i]][k-rp[i]]+t[i])<h[j][k])
	h[j][k]=h[j-rmb[i]][k-rp[i]]+t[i];//當數量相等時,再比較時間的長短;
    }
	cout<<h[m][r]<<endl;
	return 0;
}