码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-05-06 22:55:15      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:idt   include   动态规划   table   ble   order   index   height   highlight   

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

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

长度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 钢条切割问题

标签:idt   include   动态规划   table   ble   order   index   height   highlight   

原文地址:https://www.cnblogs.com/blairwaldorf/p/9000130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!