算法导论动态规划 15.1-3 钢条切割问题

Posted 暮雨煙深淺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论动态规划 15.1-3 钢条切割问题相关的知识,希望对你有一定的参考价值。

算法导论的第一个动态规划问题--钢条切割

我们知道钢条的长度和价格为:

长度i 1 2 3 4 5 6 7 8 9 10
价格pi 1 5 8 9 10 17 17 20 24 30

书上的两种方法已经很清楚,这里主要说一下课后练习里面15-3钢条成本加上切割成本,即要切割的次数最少。15-4返回切割方案

#include<fstream>
#include<iostream>
using namespace std;
int main()
{
	int const N = 11;
	int P[N] = { 0,1,5,8,8,10,17,17,20,24,30 }; //钢条长度对应的价格
	int const length = 7; //待切割的钢条长度
	int r[length+1] = { 0 },num[length+1] = { 0 };//数组r记录自底向上的每次钢条的最大价格,数组num记录切割次数
	int s[length + 1] = { 0 };//记录第一段钢条的最优切割长度
	for (int j = 1; j <= length; j++)
	{
		int q = -1,index=0;
		for (int i = 1; i <= j; i++)
		{
			if (q < P[i] + r[j - i])
			{
				q = P[i] + r[j - i];
				index = j - i;
				s[j] = i;
			}
			if (q == P[i] + r[j - i])
			{
				if (num[j - i] > num[index])
				{
					index = j - i;
					s[j] = i;
				}
			}
			
		}
		if (index == 0) num[j] == 0;
		else num[j] = num[index] + 1;
		r[j] = q;
		
	}
//	for (int i = 1; i <= length; i++)
//	{
	//	cout << num[i] << endl;
//	}
	int n = length;
	while (n > 0)
	{
		cout << s[n] << " ";
		n = n - s[n];
	}
	system("pause");
	return 0;
}

  

以上是关于算法导论动态规划 15.1-3 钢条切割问题的主要内容,如果未能解决你的问题,请参考以下文章

动态规划入门一:钢条切割问题

算法导论:钢条切割

习题—动态规划贪心算法

动态规划学习笔记--对于钢条切割方案的思考

第15章动态规划------算法导论

动态规划算法 ——钢条切割问题