• 钢条切割(动态规划)


    算法导论第15章:

    假设公司出售一段长度为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最大。
     
    当然,如果长度为n英寸的钢条价格Pn足够大,最优解可能就是完全不需要切割。
     
    对于上述价格表样例,我们可以观察所有最优收益值Ri及对应的最优解方案:
     
    R1 = 1,切割方案1 = 1(无切割)
     
    R2 = 5,切割方案2 = 2(无切割)
     
    R3 = 8, 切割方案3 = 3(无切割)
     
    R4 = 10, 切割方案4 = 2 + 2
     
    R5 = 13, 切割方案5 = 2 + 3
     
    R6 = 17, 切割方案6 = 6(无切割)
     
    R7 = 18, 切割方案7 = 1 + 6或7 = 2 + 2 + 3
     
    R8 = 22, 切割方案8 = 2 + 6
     
    R9 = 25, 切割方案9 = 3 + 6
     
    R10 = 30,切割方案10 = 10(无切割)
     
    更一般地,对于Rn(n >= 1),我们可以用更短的钢条的最优切割收益来描述它:
     
    Rn = max(Pn, R1 + Rn-1, R2 + Rn-2,...,Rn-1 + R1)
     
    首先将钢条切割为长度为i和n - i两段,接着求解这两段的最优切割收益Ri和Rn - i
     
    (每种方案的最优收益为两段的最优收益之和),由于无法预知哪种方案会获得最优收益,
     
    我们必须考察所有可能的i,选取其中收益最大者。如果直接出售原钢条会获得最大收益,
     
    我们当然可以选择不做任何切割。
     
    分析到这里,假设现在出售8英寸的钢条,应该怎么切割呢?
     
     1 #include <iostream>
     2 using namespace std;
     3 #define INF (1<<30)
     4 const int  N=10000;
     5 int r[N];
     6 int p[11]= {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
     7 int max(int a,int b)
     8 {
     9 if(a>b)return a;
    10 else return b;
    11 }
    12 int get(int n)
    13 {
    14     r[0]=0;
    15     for(int j=1;j<=n;j++)
    16     {
    17         int q=-INF;
    18         for(int i=1;i<=j;i++)
    19         {
    20         q=max(q,p[i]+r[j-i]);
    21         }
    22         r[j]=q;
    23     }
    24 return r[n];
    25 }
    26 int main()
    27 {
    28     int n;
    29 while(cin>>n)
    30 cout<<get(n)<<endl;
    31 
    32 }
  • 相关阅读:
    点击cell后 cell的背景不变,cell上的字体颜色发生改变的功能实现
    各种属性设置
    多列表 ,菜单
    正则表达式
    多个storyboard之间的跳转问题
    关于uicollectionview的个人学习
    uiscrollview的自动布局
    手动自动布局
    关于简单的跳转问题
    深入理解@class和#import的区别
  • 原文地址:https://www.cnblogs.com/lengxia/p/4725481.html
Copyright © 2020-2023  润新知