您的位置:首页 > 其它

动态规划 钢条切割

2017-05-11 17:02 260 查看
这是算法导论动态规划的一个例子,自己实现了一下~

给定一个长度为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
> 0)
return tmp
;
int ret = 0;
for (int i = 1; i <= n; i++)
{
ret = max(ret, v[i] + max_profit(v, n - i, tmp));
}
tmp
= 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
;
}

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: