动态规划之钢条切割问题

/*
 * 钢条切割方案自底向上
 */
public class CutRodBottom2Up {
	//钢条价格表
	private final int[] price={1,5,8,9,10,17,17,20,24,30};
	public static void main(String[] args) {
		new CutRodBottom2Up().start();
	}

	private void start() {
		for(int i=1;i<=10;i++) {
			//打印一种最优方案
			printCutRodSolution(i);
		}
	}

	private CutRodSolution bottomUpCutRod(int n) {
		CutRodSolution crsl = new CutRodSolution(price.length+1);
		crsl.r[0] = 0;
		for(int j=1;j<=n;j++) {
			//因为钢条价格非负,因此-1可以看做-OO
			int q=-1;
			for(int i=1;i<=j;i++) {
				if(q < price[i-1]+crsl.r[j-i]) {
					//存储最优收益值
					q = price[i-1]+crsl.r[j-i];
					//存储最优切割方法(第一次切割长度)
					crsl.s[j] = i;
				}
			}
			crsl.r[j] = q;
		}
		return crsl;
	}

	//打印输出钢条长度为n的完整切割方案
	private void printCutRodSolution(int n) {
		CutRodSolution sl = bottomUpCutRod(n);
		System.out.print("长度为"+n+"的钢条最优收益为:"+sl.r[n]+" ");
		System.out.print("切割方案为:");
		while(n > 0) {
			System.out.print(sl.s[n]+" ");
			n = n-sl.s[n];
		}
		System.out.println();
	}

	//内部类存储最优切割方案信息
	private static class CutRodSolution {
		//存储最优收益值数组r[0..n]
		int[] r = null;
		//存储最优切割方案数组s[0..n]
		int[] s = null;
		public CutRodSolution(int capacity) {
			r = new int[capacity];
			s = new int[capacity];
		}
	}
}

时间: 2024-10-23 06:08:36

动态规划之钢条切割问题的相关文章

算法导论--动态规划(钢条切割)

钢条切割问题 现有一段长度为n英寸的钢条和一个价格表pi,求切割方案使销售利益最大rn最大 长度为n英寸的钢条共有2n?1种不同的切割方案,因为可以每个整英寸的位置都可以决定切割或者不切割. 为了得到rn最大,可以把这个问题分成子问题求解,先切一刀,再考虑余下的部分的最大收益即求 rn=max{pk+rn?k}(k=1,2,3-n-1), pk部分不进行继续切割,直接作为一个整体售出 ; rn?k部分继续切割,考虑所有的情况,分成子问题. 求出所有k值对应的收益最大者作为rn 也有可能不进行任何

动态规划之钢条切割

动态规划方法通常用来求解最优化问题.动态规划算法设计步骤: 1.刻画一个最优解的结构特征. 2.递归定义最优解的值. 3.计算最优解的值,通常采用自底向上的方法. 4.利用计算出的信息构造一个最优解. 动态规划的实现方法: 带备忘的自顶向下法:此方法仍按自然的递归形式编写过程,但过程会保存每个子问题的解(通常保存在一个数组或散列表中).当需要一个子问题的解时,过程首先检查是否已经保存过此解.如果是,则直接返回保存的值,从而节省了计算时间:否则,按通常方式计算这个子问题. 自底向上法:这种方法一般

《算法导论》中动态规划求解钢条切割问题

动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契数列.在斐波那契数列的求解问题中,我们经常要对一个公共子问题进行多次求解,而动态规划算法,则对每个子问题只求解一次,将其解保存在一个表格中,从而避免了大量的冗余计算量. 动态规划算法常用于寻找最优解问题(optimization problem).而其规划大概可分为四步: 1.刻画一个最优解的结构特

算法导论---------动态规划之钢条切割

动态规划方法通常用来求解最优化问题.动态规划算法设计步骤: 1.刻画一个最优解的结构特征. 2.递归定义最优解的值. 3.计算最优解的值,通常采用自底向上的方法. 4.利用计算出的信息构造一个最优解. 动态规划的实现方法: 带备忘的自顶向下法:此方法仍按自然的递归形式编写过程,但过程会保存每个子问题的解(通常保存在一个数组或散列表中).当需要一个子问题的解时,过程首先检查是否已经保存过此解.如果是,则直接返回保存的值,从而节省了计算时间:否则,按通常方式计算这个子问题. 自底向上法:这种方法一般

动态规划实现钢条切割问题

1 /** 2 * 动态规划实现实现钢条切割问题 3 */ 4 public class Test1 { 5 6 static int[] result = {0,0,0,0,0,0,0,0,0,0,0}; 7 static int[] s = {0,0,0,0,0,0,0,0,0,0,0}; 8 9 public static void main(String[] args) { 10 int[] arr = {0,1,5,8,9,10,17,17,20,24,30}; 11 /* 12 Sy

【算法设计-动态规划】钢条切割问题

问题:给定一段长度为n英寸的钢条和一个价格表pi(i=1,2,...,n),求切割钢条方案,使得销售收益rn最大.如果长度为n英寸的钢条的价格pn足够大,最优解可能就是完全不需要切割. 方法一:递归 从上而下把所有的全部搜索一遍 int CUT_ROD(int p[],int n) { if(n==0) return 0; int q=INT_MIN; for(int i=1;i<=n;i++) { q=max(q,p[i]+CUT_ROD(p,n-i)); printf("n=%d&qu

算法导论动态规划 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;

算法导论-动态规划-钢条切割

动态规划通常用于解决最优化问题,在这类问题中,通过做出一组选择来达到最优解.在做出每个选择的同时,通常会生成与原问题形式相同的子问题.当多于一个选择子集都生成相同的子问题时,动态规划技术通常就会很有效,其关键技术就是对每个这样的子问题都保存其解,当其重复出现时即可避免重复求解. 钢条切割问题 Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案.假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1,2,…,单位为美元

动态规划 钢条切割问题

#include <stdio.h> /* *钢条切割问题: *问题描述 假设公司出售一段长度为i英寸的钢条的价格为Pi(i = 1, 2, ...单位:美元),下面给出了价格表样例: 长度i 1 2 3 4 5 6 7 8 9 10 价格Pi 1 5 8 9 10 17 17 20 24 30 切割钢条的问题是这样的:给定一段长度为n英寸的钢条和一个价格表Pi,求切割方案,使得销售收益Rn最大. */ //假定价格一开始已经给出了,用全局的写死 #define max(x,y) (x)>