动态规划(钢条切割问题 Java/Python/Golang)

本文探讨了如何使用Java、Python和Go三种编程语言实现针对给定价格数组和钢条长度的最优切割策略,以求解钢条切割问题并最大化收益。通过原始求解方法、备忘录法和自底向上策略,对比不同算法的效率与效果。
摘要由CSDN通过智能技术生成

问题描述(引用算法导论描述):给定一段长度为n英寸的钢条(一个整型)和一个价格表p(一个数组)求钢条最优切割方案,使得销售的收益最大,如果n英寸的钢条的价格p[n]足够大,那么钢条有可能不需要切割

Java版本

原始版:

//原始求解方法
    /**
     * 
     * @param p 价格数组
     * @param n 钢条长度
     * @return 最优的价格
     */
    public int primaryCut(int[] p,int n){
        if(n == 0){
            return 0;
        }
        int q = Integer.MIN_VALUE;
        for (int i = 1; i <= n; i++) {
            q = Math.max(q,p[i] + primaryCut(p,n-i));
        }

        return q;
    }
 //备忘录求解方法
    //使用散列表记录整个备忘录
    public int memoryCut(int[] p,int n){
        int[] memory = new int[n+1];

        for (int i = 0; i < memory.length; i++) {
            memory[i] = Integer.MIN_VALUE;
        }


        
        return memoryCutAux(p,n,memory);
    }

    public int memoryCutAux(int[] p,int n,int[] memory){
        if (memory[n]  > 0){
            return memory[n];
        }
        if(n == 0){
            return 0;
        }

        int q = Integer.MIN_VALUE;

        for (int i = 1; i <= n; i++) {
            q = Math.max(q,p[i] + memoryCutAux(p,n-i,memory));
        }

        memory[n] = q;

        return memory[n];
    }
//自底向上方法求解
    public int BottomUpmemoryCut(int[] p,int n){
        int[] r = new int[n+1];
        r[0] = 0;
        for (int i = 1; i <= n; i++) {
            int q = Integer.MIN_VALUE;
            for (int j = 1; j <= i; j++) {
                q = Math.max(q,p[j] + r[i-j]);
            }
            r[i] = q;
        }
        return r[n];
    }

Python版本:

#原始求解方法
def primary_cut(p,n):
    if n == 0:
        return 0;
    
    q = -10000
    for i in range(1,n+1):
        q = max(q,p[i] + primary_cut(p,n-i))
    
    return q
#记忆数组求解方法
def memory_cut(p,n):
    
    r = [-1 for i in range(n+1)]    
    return memory_cut_aux(p,n,r)

def memory_cut_aux(p,n,r):
    if r[n] > 0 :
        return r[n]
    if n == 0:
        return 0
    else :
        q = -1
        for i in range(1,n+1):
            q = max(q,p[i] + memory_cut_aux(p,n-i,r))
        r[n] = q
    return r[n]
#自底向上求解方法
def buttom_up_memory_cut(p,n):
    r = [-1 for i in range(n+1)]

    r[0] = 0
    
    for i in range(1,n+1):
        q = -1
        for j in range(1,i+1):
            q = max(q,p[j] +r[i - j])
        r[i] = q
    return r[n]

Golang版本:

//primary
func primaryCut(p []int, n int) int {
	if n == 0 {
		return 0
	}
	q := -1

	for i := 1; i <= n; i++ {
		q = max(q, p[i]+primaryCut(p, n-i))
	}
	return q
}
//记忆数组
func memoryCut(p []int, n int) int {
	r := []int{}
	for i := 0; i <= n; i++ {
		r = append(r, -1)
	}
	return memoryCutAux(p, n, r)
}

func memoryCutAux(p []int, n int, r []int) int {
	if r[n] > 0 {
		return r[n]
	}
	if n == 0 {
		return 0
	}
	q := -1

	for i := 1; i <= n; i++ {
		q = max(q, p[i]+memoryCutAux(p, n-i, r))
	}
	r[n] = q
	return r[n]
}

//自底向下
func bottomUpMemory(p []int, n int) int {
	r := []int{}
	for i := 0; i <= n; i++ {
		r = append(r, -1)
	}
	r[0] = 0

	for i := 1; i <= n; i++ {
		q := -1
		for j := 1; j <= i; j++ {
			q = max(q, p[j]+r[i-j])
		}
		r[i] = q
	}
	return r[n]
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值