import java.util.*;
public class Main {
public static int findMaxScore(int[][] dp,String[] score,String[] time,int num,int target){
for(int i=0;i<target+1;i ++){
dp[0][i] = 0;
}
for(int i=0;i<num+1;i ++){
dp[i][0] = 0;
}
for(int i=1;i<num+1;i ++){
for(int j=1;j<target+1;j ++){
if(j<Integer.parseInt(time[i-1])){
// dp[i][j] = dp[i-1][j-1];
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-Integer.parseInt(time[i-1])]+Integer.parseInt(score[i-1]));
}
}
}
return dp[num][target];
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int e_num = Integer.parseInt(scan.nextLine());//测试数
while(e_num>0){
String[] count_data = scan.nextLine().split(" ");
int row = Integer.parseInt(count_data[0]);
int col = Integer.parseInt(count_data[1]);
int t_score = Integer.parseInt(count_data[2]);
String[] score = new String[row];
String[] time = new String[row];
for(int i=0;i<row;i ++){
String[] data = scan.nextLine().split(" ");
time[i] = data[0];
score[i] = data[1];
}
int[][] dp = new int[row+1][col+1];
int result = findMaxScore(dp,score,time,row,col);
int min = 0;
//回溯
for(int i=row;i>0;i --){
if(dp[i][col] != dp[i-1][col]){
result -= Integer.parseInt(score[i-1]);
min += Integer.parseInt(time[i-1]);
}
}
if(dp[row][col] >= t_score){
System.out.println("YES "+min);
}else{
System.out.println("NO");
}
e_num --;
}
}
}
南大高级算法作业之是否能通过考试
猜你喜欢
转载自blog.csdn.net/fumonster/article/details/103191061
今日推荐
周排行