当前位置:   article > 正文

钢条的最优切割问题_a题 钢板最优切割路径问题

a题 钢板最优切割路径问题

问题描述:

一家公司购买长钢条,将其切割成短钢条出售,假设切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。

举一个例子来说:

例如某公司以单价26元买到了一批长度为10的钢条,目前各长度钢条的市场价如下表所示:

长度i

1

2

3

4

5

6

7

8

9

10

价格Pi

1

5

8

9

10

17

17

20

24

26

要求:

随机生成钢条长度n和不同长度钢条的价格信息,编写程序确定一种钢条的切割方案,使公司的收益最大化。

动态规划:
对于长度为n的钢条,我们可以先切一刀,切下长度为1-10的钢条,共10种切法,
最大收益就是切下的钢条收益和剩下钢条的最大收益之和。

钢条长度为1的最大收益计算出来,保存到r[1]

长度为2的钢条,遍历每一种切法,收益最大的保存到r[2]

计算长度为n的钢条的最大收益,此时r数组已经保存了1——n-1长度钢条的最大收益
遍历这10种切法,就可以找到最大的收益

由于每种钢条长度的最大收益都被保存在数组r中,避免了很多的重复计算

设计思路:

对于一个动态规划问题:

第一步先确定最优解的结构。如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。使用动态规划算法时,用子问题的最优解来构造原问题的最优解。因此必须考查最优解中用到的所有子问题。

第二步定义最优解的计算公式

第三步根据得到的求最优解公式,计算出结果。

第四步构造出最优解。

算法设计:

首先生成随机价格,将不同长度的钢条价格生成,然后通过算法去计算最优解,即最优切割问题的最优解,得到最高价格。

代码:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. int N[11]={};//存储价格
  5. int r[11]={};
  6. int upToDown(int);
  7. int maxx(int a,int b);
  8. int main()
  9. {
  10. int z,x,c,a[11]={0};
  11. printf("钢条长度:");
  12. for(z=0;z<=10;z++)
  13. printf("%3d",z);
  14. //随机数生成,生成不同钢条长度的不同价格
  15. srand((unsigned)time(NULL));
  16. for(z=0;z<=10;z++)
  17. {
  18. a[z]=rand()%(25)+4;
  19. }
  20. printf("\n");
  21. for(z=0;z<=9;z++)
  22. for(x=z+1;x<=10;x++)
  23. {
  24. if(a[z]>a[x])
  25. {
  26. c=a[z];
  27. a[z]=a[x];
  28. a[x]=c;
  29. }
  30. }
  31. a[0]=0;
  32. a[1]=1,a[2]=4,a[3]=7;
  33. printf("钢条价格:");
  34. for(z=0;z<=10;z++)
  35. N[z]=a[z];
  36. for(z=0;z<=10;z++)
  37. printf("%3d",a[z]);
  38. //对钢条进行切割计算
  39. int current;
  40. puts("\n输入你要裁剪的钢条长度:");
  41. scanf("%d",&current);
  42. int i;
  43. printf("%d长的钢条最大收益是:%d\n",current,upToDown(current));
  44. printf("各个长度的收益情况:\n长度:");
  45. for(i=0;i<=current;i++)
  46. {
  47. printf("%3d ",i);
  48. }
  49. printf("\n");
  50. printf("收益:");
  51. for(i=0;i<=current;i++)
  52. {
  53. printf("%3d ",r[i]);
  54. }
  55. }
  56. int upToDown(int n) //每次返回的值是当前长度n的最大收益
  57. {
  58. if(n==0)
  59. return 0;
  60. int q=N[n];
  61. int i;
  62. for(i=1;i<n;i++)
  63. q=maxx(q,r[i]+upToDown(n-i));
  64. r[n]=q;
  65. if(r[n]!=0)
  66. return r[n];
  67. return q;
  68. }
  69. int maxx(int a,int b)//比较大小
  70. {
  71. if(a>=b)
  72. return a;
  73. else
  74. return b;
  75. }

算法求解:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/774918
推荐阅读
相关标签
  

闽ICP备14008679号