算法实践篇-钢条切割问题-动态规划

发布一个k8s部署视频:https://edu.csdn.net/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.csdn.net/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.csdn.net/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

问题描述:给定一个钢条的长度,求最大效益和切割方法
长度和价格的关系如下:
length  1  2  3  4  5  6  7  8  9  10
price   1  5  8  9  10 17 17 20 24 30

package com.dynamic;

public class CutRod {
	private int []price;
	private int length;
	private int []r;
	private int []s;
	public CutRod(int []price){
		this.price=price;
	}
	/**
	 *自顶向下递归 
	 * @param length
	 * @return
	 */
	public int momoizedCutRod(int length){
		r=new int[length+1];
		for(int i=0;i<=length;i++){
			r[i]=-1;
		}
		return memoizedCutRodAux(length,r);
	}
	private int memoizedCutRodAux(int length,int []r){
		if(r[length]>=0){
			return r[length];
		}
		int q;
		if(length==0){
			q=0;
		}else{
			if(length>=price.length){
				q=price[price.length-1];
			}else{
				q=price[length];
			}
			if(length>price.length){
				for(int i=1;i<=price.length-1;i++){
					q=Math.max(q, price[i]+memoizedCutRodAux(length-i,r));
				}
			}else{
				for(int i=1;i<=length-1;i++){
					q=Math.max(q, price[i]+memoizedCutRodAux(length-i,r));
				}
			}
		}
		r[length]=q;
		return q;
	}
	
	public int bottomUpCutRod(int length){
		r=new int[length+1];
		r[0]=0;
		for(int j=1;j<=length;j++){
			int q=0;
			if(j>=price.length){
				q=price[price.length-1];
			}else{
				q=price[j];
			}
			for(int i=1;i<=j;i++){
				q=Math.max(q, price[i]+r[j-i]);
			}
			r[j]=q;
			
		}
		return r[length];
	}
	
	public int extendBottomUpCutRod(int length){
		r=new int[length+1];
		s=new int[length+1];
		r[0]=0;
		for(int j=1;j<=length;j++){
			int q=0;
			if(j>=price.length){
				q=price[price.length-1];
			}else{
				q=price[j];
			}
			for(int i=1;i<=j;i++){
				if(q<=price[i]+r[j-i]){
					q=price[i]+r[j-i];
					s[j]=i;
				}
			}
			r[j]=q;
			
		}
		return r[length];
	}
	
	public void printSolution(int length){
		extendBottomUpCutRod(length);
		int n=length;
		while(n>0){
			System.out.print(s[n]+" ");
			n=n-s[n];
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		int []price=new int[]{0,1,5,8,9,10,17,17,20,24,30};
		CutRod cut=new CutRod(price);
		System.out.println(cut.extendBottomUpCutRod(3));
		cut.printSolution(3);
		System.out.println(cut.extendBottomUpCutRod(4));
		cut.printSolution(4);
		System.out.println(cut.extendBottomUpCutRod(5));
		cut.printSolution(5);
		System.out.println(cut.extendBottomUpCutRod(10));
		cut.printSolution(10);
		System.out.println("===========");
		System.out.println(cut.bottomUpCutRod(5));
		System.out.println("===========");
		System.out.println(cut.momoizedCutRod(4));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值