【算法导论】动态规划切钢条

根据《算法导论》中的动态规划方法,解决给定长度钢条的切割问题,以最大化收益。通过递归穷举和动态规划两种方式,其中动态规划避免了递归的重复计算并使用额外空间存储结果。
摘要由CSDN通过智能技术生成

问题:钢条切割

   给定长度为n英寸的钢条,和一个价格表P{1....n},求切割钢条的方案,使得收益R最大。如果钢条价格足够大,可以完全不用切割。

来源:算法导论,第15章

方法:1、递归穷举;2、动态规划


思路:

递归穷举:钢条分为两部分左边为不切割部分范围长度j,右边为切割部分范围n-j,收益Max{R = P[j]+R[n-j]}

	private static int findCutRod(int[]p,int n) {
		if(n==0){
			return 0;
		}
		int q=Integer.MIN_VALUE;
		for(int j=1;j<=n;j++){
			q =Math.max(q, p[j-1]+findCutRod(p, n-j));
		}
		
		return q;
	}

缺点:当n增加,运行时间会爆炸式增长(画个递归树,非常明白就看出来了),原因是,重复的计算了很多次

优点:不需要借助额外的空间


动态规划:思路与递归相同,

                  不同的是:创建一个数组保存已经计算过的切割次数对应的收益,直接查表,避免重复计算

                 下面是自顶向下的程序,为了方便数组从1开始为有效值

	private static 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值