hdu 2159 FATE 二维背包
生活随笔
收集整理的這篇文章主要介紹了
hdu 2159 FATE 二维背包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
FATE
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)Problem 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先求出不超過他的忍耐度殺完s只怪時能夠得到的經驗值, 如果能升完最后一級,再求用去多少忍耐度就能夠升級,最后用他的忍耐度減去需要消耗的忍耐度即可 /*忍耐度當做體積,經驗值當做價值,怪的只數當做物品數量*/狀態轉移方程:f[i][j]=max{f[i][j],f[i-b][j-1]+a} i表示忍耐度,j表示殺怪數代碼:/*忍耐度當做體積,經驗值當做價值,怪的只數當做物品數量*/ #include<stdio.h> #include<string.h> int dp[105][105],a[105],b[105]; int max(int a,int b) {return a>b?a:b; } int main() {int i,j,k,n,m,K,s;while(scanf("%d%d%d%d",&n,&m,&K,&s)!=EOF){for(i=0;i<K;i++)scanf("%d%d",&a[i],&b[i]);memset(dp,0,sizeof(dp));for(i=0;i<K;i++) //控制第幾組for(j=b[i];j<=m;j++) //控制忍耐度for(k=1;k<=s;k++) //控制殺怪只數dp[j][k]=max(dp[j][k],dp[j-b[i]][k-1]+a[i]);//不殺這只怪之前的經驗值加上殺了之后的經驗值,所以k-1if(dp[m][s]>=n){for(i=0;i<=m;i++) //尋找能夠升級所消耗的最小忍耐度,只用找消耗相同忍耐度的情況下,令殺怪數量最多,if(dp[i][s]>=n) //dp[i][s]是消耗i忍耐度的情況下,獲得的最大經驗值{printf("%d\n",m-i); //求剩余的忍耐度break;}}elseprintf("-1\n"); //不能升級}return 0; }
總結
以上是生活随笔為你收集整理的hdu 2159 FATE 二维背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个小的技术细节
- 下一篇: hdu 4501 小明系列故事—