[关闭]
@chawuciren 2018-11-30T12:46:11.000000Z 字数 976 阅读 589

15.1实现

算法导论


以下是cut rob的c语言实现

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int max(int a,int b);//找两个数中最大值的函数
  4. int mcr(int p[]);//这个和mcra配套,计算cut rob的最大利润,可以记忆
  5. int buc(int p[],int n);//更加简洁的记忆版本
  6. int mcra(int p[],int n,int r[]);
  7. void ebucr(int p[],int n);//更加高级的记录过程版本(不知道对不对)
  8. int main(){
  9. int p[11]={0,1,5,8,9,10,17,17,20,24,30};//第一个元素放0,后面会好操作
  10. ebucr(p,11);
  11. return 0;
  12. }
  13. int mcr(int p[]){
  14. int r[11];
  15. for(int i=0;i<11;i++)
  16. r[i]=-100;
  17. return mcra(p,9,r);//修改这里的数字,就可以算不同的总长最大利润(仅限于10以内)
  18. }
  19. int mcra(int p[],int n,int r[]){//
  20. int q;
  21. if(r[n]>=0)
  22. return r[n];
  23. if(n==0){
  24. q=0;
  25. }
  26. else{
  27. q=-1;
  28. for(int i=1;i<=n;i++){
  29. q=max(q,p[i]+mcra(p,n-i,r));
  30. }
  31. }
  32. r[n]=q;
  33. return q;
  34. }
  35. int max(int a,int b){
  36. if(a>=b)
  37. return a;
  38. else
  39. return b;
  40. }
  41. int buc(int p[],int n){
  42. int r[11]={0};
  43. int q=-100;
  44. for(int j=1;j<11;j++){
  45. for(int i=1;i<=j;i++){
  46. q=max(q,p[i]+r[j-i]);
  47. }
  48. r[j]=q;
  49. }
  50. return r[n];
  51. }
  52. void ebucr(int p[],int n){
  53. int r[11]={0};
  54. int s[11]={0};
  55. int q;
  56. r[0]=0;
  57. for(int j=1;j<=n;j++){
  58. q=-100;
  59. for(int i=1;i<=j;i++){
  60. if(q<p[i]+r[j-1]){
  61. q=p[i]+r[j-i];
  62. s[j]=i;
  63. }
  64. }
  65. r[j]=q;
  66. }
  67. for(int i=0;i<n;i++){
  68. printf("%d",r[i]);
  69. printf("%d",s[i]);
  70. }
  71. return;
  72. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注