动态规划-切割钢条

动态规划按照我的理解就是避免重复计算,牺牲空间换时间,将重复计算的结果保存起来,下次用的时候,直接使用保存的结果,我文字不多,直接上代码,没有编程基础的兄弟们可能不太能看懂

两种方式一种是递归,另一种是递推(其实就是采用for循环)

/*
*动态规划-切割钢条
*米(m)  :1  2  3  4  5    6    7     8    9    10
*价格(p):1  5  8  9  10   17   17    20   24   30
*/
#include<stdio.h>
#include<stdlib.h>

int p[11];
int *r = NULL; /*记录钢条米长的最佳结果,避免重复计算*/


int max(int a , int b){
    return a > b ? a : b;
}

/*
*切割钢条函数入口,对一些参数进行初始化
*@length 钢条长度
*/
int CuttingSteelBarEntrance(int length){
    p[1] = 1;
    p[2] = 5;
    p[3] = 8;
    p[4] = 9;
    p[5] = 10;
    p[6] = 17;
    p[7] = 17;
    p[8] = 20;
    p[9] = 24;
    p[10] = 30;
    r = (int *)malloc((length + 1) *sizeof(int)); /*分配长度*/
    for(int i = 1 ; i <= length ;i++){
        r[i] = -1;
    }
    return  CuttingSteelBarRunning2(length);
}
/*
*length : 钢条长度,不超过10米
*递归:自顶向下
*/
int CuttingSteelBarRunning1(int length){
    if(length <= 0){
        return 0;
    }else if(r[length] != -1){
        return r[length]; /*直接返回length长钢条的最佳利益*/
    }
    int q = -1;
    for(int i = 1 ; i <= length ; i++){
        q = max(q , p[i] + CuttingSteelBarRunning1(length - i));
    }
    r[length] = q; /*记录length米钢条的最佳利益*/
    return q;
}

/*
*length : 钢条长度,不超过10米
*递推:自底向上
*/
int CuttingSteelBarRunning2(int length){
    int q = -1;
    r[0] = 0;
    r[1] = p[1];
    for(int i = 1 ; i <= length ; i++){
        for(int j = 1 ; j <= i ; j++){
            q = max(q , p[j] + r[i - j]);
        }
        r[i] = q;
    }
    return q;
}

算法不完美,希望各位指点,随便吐槽

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值