递归实现钢条切割问题(Java版)

博客探讨了使用递归算法解决钢条切割问题的两种思路。第一种方法是通过比较所有可能的切割组合,找到最大价值。第二种方法是固定一边钢条长度,寻找另一边的最大价值。每种方法都通过迭代和比较来确定最佳切割策略。博客提供了具体的Java代码实现,并以一个样例数据集进行演示。
摘要由CSDN通过智能技术生成

钢条切割问题递归有两种思想:

1.切割一刀分别获取两两边的最优解相加,获取两两相加的最优解和不切割的比较这样就可以得出可以分割的最大价值。

公式:r(n)=max(p[n] , r(1)+r(n-1) , r(2)+r(n-2) ,……,r(n-1)+r1)

public static int cut(int[] p, int value) {
        if (value == 0) {
            return 0;
        } else {
            int result = 0;
            //防止越界,如果钢条长度超过了数组的长度就让不分的价值为-1
            if (value > p.length - 1) {
                result = -1;
            } else {
                result = p[value];
            }

            for (int i = 1; i < value; i++) {
                result = Math.max(result, cut(p, value - i) + cut(p, i));
            }
            return result;
        }
    }

2.也是切割一刀,让左边的不在分割,左边从价值表中的钢条长度一个个遍历上去,然后求出右边最大解。

一开始很懵,后面经历了在纸上画图,大致也明白了,我们最后切割出来的最优方案肯定有价值表中的其中一段, 那么我们就分别用价值表中的一段去和右边的最优的值相加,最后再比较一下谁的最大就ok了,一开始蒙的地方是,左边是3,那3也可以分割成1和2,或2和1,为啥左边不分隔,右边分割也可以计算出来,左边都不是最优值。其实仔细想想也能想明白,我们用1当左边钢条的时候我们其实就计算过了1开始的这种可能性了,以此类推,2开头的可能性我们也在2在左边时候计算过了,其实所有的情况都是可以遍历到的。

公式:r(n)=max(p[i]+r(n-i))

public static int cut1(int[] p, int value) {
        if (value == 0) {
            return 0;
        } else {
            int result = 0;
            if (value > p.length - 1) {
                result = -1;
            } else {
                result = p[value];
            }

            for (int i = 1; i < value; i++) {
                result = Math.max(result, cut1(p, value - i) + p[i]);
                if (i > p.length - 1) {
                    break;
                }
            }
            return result;
        }
    }
private static int[] p = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};

    public static void main(String[] args) {
        System.out.println(cut1(p, 11));
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值