南大高级算法作业之是否能通过考试

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 --;
		}
    }
}
发布了36 篇原创文章 · 获赞 2 · 访问量 1978

猜你喜欢

转载自blog.csdn.net/fumonster/article/details/103191061