FATE
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3966 Accepted Submission(s): 1755
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();
}
}
}