动态规划求最大工作价值(java实现)

上图表达的是一个人在工厂上班的任务计划,横坐标代表时间,灰色区域的黑色数字代表任务的编号,红色数字代表完成任务所得到的报酬,并且这个人在同一时间内只能完成一个任务,求这个在这一天工作中所获得的最大报酬。

下面是由题意列出的递归方程:

opt(i)=v(i)+opt(prev(i)) 选择当前的任务

opt(i) = opt(i-1) 不选择当前的任务

上面方程中的opt(i)代表考虑到任务i时所获得的最大报酬,v(i)代表当前任务i所对应的报酬,prev(i)代表当前任务i前面还可以做哪个任务。由图得到了v(i)和prev(i)所对应的数组int[] prev = new int[] {0,0,0,1,0,2,3,5};和

int[] v = new int[] {5,1,8,4,6,3,2,4};所以最后得到了这个递归方程所对应的java代码:

public class ChoiceOrNot {
	//存储在选择第i个任务时,它前面可以做的任务编号,0表示无任务可做
	static int[] prev = new int[] {0,0,0,1,0,2,3,5};
	//存储每个任务所对应的价值
	static int[] v = new int[] {5,1,8,4,6,3,2,4};
	
	//比较两个整数的大小,并返回较大的整数
	public static int max(int a,int b) {
		if(a>=b) 
			return a;
		else
			return b;
				
	}
	
	//求做任务可以得到的最大价值(递归法)
	public static int rec_opt(int i) {
		if(i<=0)
			return 0;
		if(i==1) 
			return v[i-1];
		int choice = v[i-1] + rec_opt(prev[i-1]);
		int notChoice = rec_opt(i-1);
		return max(notChoice,choice);
	}
	
	//求做任务可以得到的最大价值(动态规划法)
	public static int dp_opt() {
		int[] opt = new int[v.length+1];
		opt[0] = 0;
		opt[1] = v[0];
		for(int i=1;i<opt.length;i++) {
			int choice = v[i-1]+opt[prev[i-1]];
			int notChoice = opt[i-1];
			opt[i] = max(choice,notChoice);
		}
		return opt[opt.length-1];
	}
	
	public static void main(String[] args) {
		int result1 = rec_opt(8);
		int result2 = dp_opt();
		System.out.println(result1);
		System.out.println(result2);
	}
}

运行结果为:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值