寵物小精靈是一部講述小智和他的搭檔皮卡丘一起冒險的故事。
一天,小智和皮卡丘來到了小精靈狩獵場,裡面有很多珍貴的野生寵物小精靈。
小智也想收服其中的一些小精靈。
然而,野生的小精靈並不那麼容易被收服。
對於每乙個野生小精靈而言,小智可能需要使用很多個精靈球才能收服它,而在收服過程中,野生小精靈也會對皮卡丘造成一定的傷害(從而減少皮卡丘的體力)。
當皮卡丘的體力小於等於0時,小智就必須結束狩獵(因為他需要給皮卡丘療傷),而使得皮卡丘體力小於等於0的野生小精靈也不會被小智收服。
當小智的精靈球用完時,狩獵也宣告結束。
我們假設小智遇到野生小精靈時有兩個選擇:收服它,或者離開它。
如果小智選擇了收服,那麼一定會扔出能夠收服該小精靈的精靈球,而皮卡丘也一定會受到相應的傷害;如果選擇離開它,那麼小智不會損失精靈球,皮卡丘也不會損失體力。
小智的目標有兩個:主要目標是收服盡可能多的野生小精靈;如果可以收服的小精靈數量一樣,小智希望皮卡丘受到的傷害越小(剩餘體力越大),因為他們還要繼續冒險。
現在已知小智的精靈球數量和皮卡丘的初始體力,已知每乙個小精靈需要的用於收服的精靈球數目和它在被收服過程中會對皮卡丘造成的傷害數目。
請問,小智該如何選擇收服哪些小精靈以達到他的目標呢?
輸入格式
輸入資料的第一行包含三個整數:n,m,k,分別代表小智的精靈球數量、皮卡丘初始的體力值、野生小精靈的數量。
之後的k行,每一行代表乙個野生小精靈,包括兩個整數:收服該小精靈需要的精靈球的數量,以及收服過程中對皮卡丘造成的傷害。
輸出格式
輸出為一行,包含兩個整數:c,r,分別表示最多收服c個小精靈,以及收服c個小精靈時皮卡丘的剩餘體力值最多為r。
資料範圍
0輸入樣例1:
10 100 5
7 10
2 40
2 50
1 20
4 20
輸出樣例1:3 30
輸入樣例2:10 100 5
8 110
12 10
20 10
5 200
1 110
輸出樣例2:0 100
需要注意的地方
1.比01揹包多了乙個條件,要滿足精靈球充足,還要滿足體力值充足,所以可以開乙個二維的dp陣列,
2.要注意當小智抓到某個精靈後體力值變為0的話,他是抓不到這個小精靈的,所以他的體力值實際上是m-1.
3.要求剩餘體力值最大,也就是消耗的體力值最少。我們在考慮所有的精靈球的裡邊掃一遍,從小到大掃,當某個體力值的時候跟結果相等了,就是我們要求的最小體力值了。
ac**
#include
using
namespace std;
const
int n=
1010
;const
int m=
510;
const
int k=
110;
int n,m,k;
int a[k]
,b[k]
;int dp[n]
[m];
intmain()
for(
int i=
1;i<=k;i++)}
}// for(int i=1;i<=n;i++)
// cout// int ans=0;
for(
int i=
0;ians=m-ans;
printf
("%d %d"
,dp[n]
[m-1
],ans)
;return0;
}
寵物小精靈之收服
poj 4978 有兩個限制,小智的精靈球和皮卡丘的體力值,所以建乙個二維陣列來列舉各個精靈球和體力值。每一次判斷一下是不是比全域性最大值大。然後更新一 力值。剛開始沒有搞清楚應該正著迴圈還是倒著迴圈,總是寫不對。其實先仔細想想還是挺好寫的。include include include inclu...
1292 寵物小精靈之收服
寵物小精靈是一部講述小智和他的搭檔皮卡丘一起冒險的故事。一天,小智和皮卡丘來到了小精靈狩獵場,裡面有很多珍貴的野生寵物小精靈。小智也想收服其中的一些小精靈。然而,野生的小精靈並不那麼容易被收服。對於每乙個野生小精靈而言,小智可能需要使用很多個精靈球才能收服它,而在收服過程中,野生小精靈也會對皮卡丘造...
寵物小精靈之收服(dp
寵物小精靈是一部講述小智和他的搭檔皮卡丘一起冒險的故事。一天,小智和皮卡丘來到了小精靈狩獵場,裡面有很多珍貴的野生寵物小精靈。小智也想收服其中的一些小精靈。然而,野生的小精靈並不那麼容易被收服。對於每乙個野生小精靈而言,小智可能需要使用很多個精靈球才能收服它,而在收服過程中,野生小精靈也會對皮卡丘造...