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

 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         System.out.println("自顶向下结果");
13         for (int i = 0; i < arr.length; i++) {
14             System.out.print("r"+ i +"=" + UpDown(i, arr)+"; ");
15         }
16         */
17         /*
18         System.out.println("自底向上结果");
19         for (int i = 0; i < arr.length; i++) {
20             System.out.print("r"+ i +"=" + DownUp(i, arr)+"; ");
21         }
22         */
23     }
24
25     /**
26      * 自顶向下实现
27      */
28     static int UpDown(int num, int[] arr) {
29         if(num == 0) return 0;
30         if(result[num] != 0) return result[num];
31
32         int temp = 0;
33         for (int i = 1; i < num+1; i++) {
34             int max = arr[i] + UpDown(num-i, arr);
35             if(max > temp) {
36                 temp = max;
37             }
38         }
39         result[num] = temp; //将计算的长度为n的钢条切割的长度用数组保存起来
40         return temp;
41     }
42
43     /**
44      * 自底向上实现
45      */
46     static int DownUp(int num, int[] arr) {
47         for (int i = 1; i < num + 1; i++) {
48             int temp = 0;
49             for (int j = 1; j <= i; j++) {
50                 int max = arr[j] + result[i - j];
51                 if(max > temp) {
52                     temp = max;
53                 }
54             }
55             result[i] = temp;
56         }
57         return result[num];
58     }
59 }

原文地址:https://www.cnblogs.com/fsmly/p/10046748.html

时间: 2024-10-14 01:04:06

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

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

钢条切割问题 现有一段长度为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.利用计算出的信息构造一个最优解. 动态规划的实现方法: 带备忘的自顶向下法:此方法仍按自然的递归形式编写过程,但过程会保存每个子问题的解(通常保存在一个数组或散列表中).当需要一个子问题的解时,过程首先检查是否已经保存过此解.如果是,则直接返回保存的值,从而节省了计算时间:否则,按通常方式计算这个子问题. 自底向上法:这种方法一般

动态规划之钢条切割问题

/* * 钢条切割方案自底向上 */ 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++) { //打印一种最优方案 prin

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

问题:给定一段长度为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)>