HDU 2159 FATE

FATE

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3966    Accepted Submission(s): 1755


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
 
package hdu;

import java.util.Scanner;
/**
 * @description					        HDU 2159 FATE
 * @technique							二維揹包問題
 * @date								20120823
 * @time								16:24
 * @version								1.0
 * @author 								Alex
 *
 */
public class Hdu2159_20120823_0 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int maxExp;  //經驗值
		int maxPv; //忍耐值
		int kind; //怪物種類
		int maxKill;//最大殺怪數
		int i;
		int [] exp, pv;
		while(in.hasNextInt()){
			maxExp = in.nextInt();
			maxPv = in.nextInt();
			kind = in.nextInt();
			maxKill =  in.nextInt();
			exp = new int[kind];
			pv = new int[kind];
			for(i = 0; i < kind; ++i){
				exp[i] = in.nextInt();
				pv[i] = in.nextInt();
			}
			System.out.println(sovle(maxExp,maxPv,exp,pv,maxKill));
		}
	}
	private static int sovle(int maxExp, int maxPv, int [] exp, int [] pv, int maxKill){
		int i,j,k;
		int [][] dp = new int[maxKill+1][maxPv+1]; //行是殺怪物的個數。列是忍耐值。
		for(i = 1; i <= maxKill; ++i){
			for(j = 0; j <= maxPv; ++j){
				for(k = 0; k < exp.length; ++k){  //k 是所殺怪的種類。
					if(j-pv[k] >= 0)
						dp[i][j] = max(dp[i][j],dp[i-1][j-pv[k]] + exp[k]);
				}
			}
		}
		//show(dp);
		for(j = 0; j < dp[0].length; ++j){
			for(i = 0; i < dp.length; ++i){
				if(dp[i][j] >= maxExp){
					return maxPv - j;
				}
			}
		}
		return -1;
	}
	private static int max(int a, int b){
		return a>b?a:b;
	}
	private static void show(int [][] dp){
		for(int [] n: dp){
			for(int i: n){
				System.out.print(i + " ");
			}
			System.out.println();
		}
	}
}

發佈了48 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章