关闭

校招编程题:求最优解题方案

标签: java动态规划
24人阅读 评论(0) 收藏 举报

题目:

一共有n道题,每道题有对应的分值grade和需要消耗的时间time,求解在规定的时间内,能得到最大的分数。

解题思路:

使用动态规划,求解最大分数。如果需要求解具体做题步骤,则需要把最大分数进行回溯,逐步找到做过的题。

这里由于题目只要求了求出最大分数,所以只编程实现了求解最大分数的目的。

代码如下:

package test;


public class DynamicProgrammingTest {
	private int length;
	private int[] grade;
	private int[] time;
	private int TimeSum;
	
	public DynamicProgrammingTest(int length,int grade[],int time[],int TimeSum) {
		// TODO Auto-generated constructor stub
		this.length = length;
		this.grade = grade;
		this.time = time;
		this.TimeSum = TimeSum;
	}
	
	public int getMaxGrade() {
		//画表格
		int MaxGrade[][] = new int[grade.length][TimeSum + 1];
		for (int i = 0;i < grade.length;i++) {
				MaxGrade[i][0] = 0;
		}
		for (int i = 0;i < TimeSum + 1;i++) {
			//这里用i <= time[0]一直不对。。卡了很久。。尬。。
			if (i < time[0]) {
				MaxGrade[0][i] = 0;
			}else {
				MaxGrade[0][i] = grade[0];
			}
		}
		//填表格
		for (int i = 1;i < grade.length;i++) {
			for (int j = 1;j < TimeSum + 1;j++) {
				if (j < time[i]) {
					MaxGrade[i][j] = MaxGrade[i-1][j];
				}
				else {
					MaxGrade[i][j] = max(MaxGrade[i-1][j],MaxGrade[i-1][j-time[i]]+grade[i]);
				}
			}
		}
		for (int i = 0;i < grade.length;i++) {
			for (int j = 0;j < TimeSum + 1;j++) {
				System.out.print(MaxGrade[i][j]+",");
			}
			System.out.println();
		}
		return MaxGrade[grade.length - 1][TimeSum];
	}
	
	public int max(int a,int b) {
		if (a>b) {
			return a;
		}
		else return b;
	}
	
	public static void main(String[] args) {
		int n = 5;
		int grade[] = {1,4,3,5,4};
		int time[] = {1,3,2,4,1};
		int TimeSum = 6;
		System.out.println(new DynamicProgrammingTest(n, grade, time, TimeSum).getMaxGrade());
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:597次
    • 积分:96
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类