动态规划 钢条切割

这是算法导论动态规划的一个例子,自己实现了一下~

给定一个长度为n英寸的钢条和一个价格表Pi(i=1,2…n),求切割钢条方案,使得销售收益Rn最大。注意,如果长度为n的钢条价格Pn足够大,则最优解可能就不需要切割。

这里写图片描述

分析:

这里写图片描述

这里写图片描述

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;


//recursion
int max_profit(const vector<int>& v, int n)
{
    if (n <= 0)
        return 0;
    int ret = 0;
    for (int i = 1; i <= n; i++)
    {
        ret = max(ret, max_profit(v, n-i) + v[i]);
    }
    return ret;
}


//dp1 Top-down
int max_profit(const vector<int>& v, int n, vector<int>& tmp)
{
    if (n == 0)
        return 0;
    if (tmp[n] > 0)
        return tmp[n];
    int ret = 0;
    for (int i = 1; i <= n; i++)
    {
        ret = max(ret, v[i] + max_profit(v, n - i, tmp));
    }
    tmp[n] = ret;
    return ret;
}

int max_profit_dp1(const vector<int>& v, int n)
{
    vector<int> tmp(n + 1, 0); //用于保存之前的结果
    if (n <= 0)
        return 0;
    return max_profit(v, n, tmp);
}


//dp2 Bottom-up
int max_profit_dp2(const vector<int>& v, int n)
{
    if (n <= 0)
        return 0;
    vector<int> tmp(n + 1, 0); //用于保存之前的结果
    for (int i = 1; i <= n; i++)
    {
        int ret = 0;
        for (int j = 1; j <= i; j++)
        {
            ret = max(ret, v[j] + tmp[i - j]);
        }
        tmp[i] = ret;
    }
    return tmp[n];
}

int main()
{
    vector<int> v(11, 0);
    v[1] = 1;
    v[2] = 5;
    v[3] = 8;
    v[4] = 9;
    v[5] = 10;
    v[6] = 17;
    v[7] = 17;
    v[8] = 20;
    v[9] = 24;
    v[10] = 30;

    cout << max_profit(v, 5) << endl;
    cout << max_profit_dp1(v, 5) << endl;
    cout << max_profit_dp2(v, 5) << endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值