XCXCXCXCX

java后台

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

题目:

一共有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());
	}
}


阅读更多
文章标签: java 动态规划
上一篇对五种排序的实现【java】
下一篇ODI配置使用日志记录streams实现表同步
想对作者说点什么? 我来说一句

阿里2016校招Java研发笔试题

2015年08月24日 965KB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭