(周三赛)FATE
//題意?打怪的經驗值?,消耗忍耐度?看升級后還能保留的最大忍耐度?
用?背包去做,不是很會啊 T T
Description
最近xhd正在玩一款叫做FATE的游戲,為了得到極品裝備,xhd在不停的殺怪做任務。久而久之xhd開始對殺怪產生的厭惡感,但又不得不通過殺怪來升完這最后一級。現在的問題是,xhd升掉最后一級還需n的經驗值,xhd還留有m的忍耐度,每殺一個怪xhd會得到相應的經驗,并減掉相應的忍耐度。當忍耐度降到0或者0以下時,xhd就不會玩這游戲。xhd還說了他最多只殺s只怪。請問他能升掉這最后一級嗎?
?
Input
輸入數據有多組,對于每組數據第一行輸入n,m,k,s(0 < n,m,k,s < 100)四個正整數。分別表示還需的經驗值,保留的忍耐度,怪的種數和最多的殺怪數。接下來輸入k行數據。每行數據輸入兩個正整數a,b(0 < a,b < 20);分別表示殺掉一只這種怪xhd會得到的經驗值和會減掉的忍耐度。(每種怪都有無數個)
?
Output
輸出升完這級還能保留的最大忍耐度,如果無法升完這級輸出-1。
?
Sample Input
10 10 1 10
1 1
10 10 1 9
1 1
9 10 2 10
1 1
2 2
?
Sample Output
0
-1
1
?
1 ///*dp[j][t] = Max(dp[j][t],dp[j-1][t-b[i]]+a[i]) 2 3 //它表示 用掉了l點的忍耐度,并且殺了j個怪后,所獲得的最大經驗數。*/ 4 5 #include<stdio.h> 6 7 #include<string.h> 8 9 10 11 struct point 12 13 { 14 15 int x,y; 16 17 }stu[1100]; 18 19 20 21 int max(int i,int j) 22 23 { 24 25 return i>j?i:j; 26 27 } 28 29 30 31 int main() 32 33 {//n還需的經驗值 34 35 int n,m,k,s,i,j,t; 36 37 int dp[100][100]; 38 39 while(scanf("%d %d %d %d",&n,&m,&k,&s)) 40 41 { 42 43 for(i=1;i<=k;i++) 44 45 { 46 47 scanf("%d %d",&stu[i].x,&stu[i].y);//殺掉一只怪會得到的經驗值 48 49 //會減掉的忍耐度 50 51 } 52 53 memset(dp,0,sizeof(dp)); 54 55 for(i=1;i<=k;i++)// k怪的種數 56 57 for(j=1;j<=s;j++)//s最多的殺怪數 58 59 for(t=stu[i].y;t<=m;t++)//m保留的忍耐度 60 61 dp[j][t]=max(dp[j][t],dp[j-1][t-stu[i].y]+stu[i].x);//背包問題 62 63 int flag=1; 64 65 for(i=1;i<=m;i++) 66 67 if(n<=dp[s][i])//判斷是否能升級 ,輸出剩余忍耐度m-i 68 69 { 70 71 flag=0; 72 73 break; 74 75 } 76 77 if(flag) 78 79 puts("-1"); 80 81 else 82 83 printf("%d\n",m-i); 84 85 } 86 87 return 0; 88 89 }View Code
?
轉載于:https://www.cnblogs.com/awsent/p/4266927.html
總結
- 上一篇: 完璧归赵的作者是谁啊?
- 下一篇: 驾照一分能换多少钱啊