动态规划: 钢条切割的三种解法

/*
钢条切割
不同长度的钢条对应不同的价格
给定一定长度的钢条,怎样切割利益最大
注意: 最优解可能是完全不需要切割
*/

#include <vector>
#include <iostream>

using namespace std;

//给定长度从1到10对应的不同价格
vector<int> price{0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
//保存每段长度对应的对大收益
vector<int> earning(100, 0);

//方法1 递归 自顶向下 效率差,重复计算多
//在长度>=30时所需要的计算时间已经不能接受了
int recursive(int len) 
{
    if (len == 0) 
        return 0;
    int max = 0;
    for (int i = 1; i <= len; i++) 
    {
        int p = price[i] + recursive(len - i);
        max = (p > max) ? p : max;
    }
    return max;
}

//方法2 使用备忘录的自顶向下 避免重复计算 提升效率
int mome(int len) 
{
    if (len == 0) 
        return 0;
    else if (earning[len] != 0) //如果有记录
        return earning[len];
    
    int max = 0;
    for (int i = 1; i <= len; i++) 
    {
        int p = price[i] + mome(len - i);
        max = (p > max) ? p : max;
    }
    earning[len] = max;
    return max;
}

//方案3 自底向上 
int fromBottomUp(int len) 
{
    for (int i = 1; i <= len; i++) 
    {
        int max = 0;
        for (int j = i; j >= 0; j--)  //计算每一步的最优解
        {
            int p = price[j] + earning[i - j];
            max = (p > max) ? p : max;
        }
        earning[i] = max;
    }
    return earning[len];
}


int main() 
{
    int n;
    cout << "钢条长度?" << endl;
    cin >> n;

    cout << fromBottomUp(n) << endl;
    cout << mome(n) << endl;
    cout << recursive(n) << endl;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值