分支限界法之LC 0/1背包

  1. 1.问题描述:已知有N个物品和一个可以容纳M重量的背包,每种物品I的重量为WEIGHT,一个只能全放入或者不放入,求解如何放入物品,可以使背包里的物品的总效益最大。
  2. 2.设计思想与分析:对物品的选取与否构成一棵解树,左子树表示不装入,右表示装入,通过检索问题的解树得出最优解,并用结点上界杀死不符合要求的结点。
  3. (多谢shadow同学提供该算法)
  4. #include <iostream.h>
  5. struct good
  6. {
  7. int weight ;
  8. int benefit ;
  9. int flag ; //是否可以装入标记
  10. } ;
  11. int number = 0 ; //物品数量
  12. int upbound = 0 ;
  13. int curp = 0, curw = 0 ; //当前效益值与重量
  14. int maxweight = 0 ;
  15. good *bag = NULL ;
  16. void Init_good ()
  17. {
  18. bag = new good [number ] ;
  19. for ( int i = 0 ; i <number ; i ++ )
  20. {
  21. cout << “请输入第件” <<i + 1 << “物品的重量:” ;
  22. cin >>bag [i ]. weight ;
  23. cout << “请输入第件” <<i + 1 << “物品的效益:” ;
  24. cin >>bag [i ]. benefit ;
  25. bag [i ]. flag = 0 ; //初始标志为不装入背包
  26. cout <<endl ;
  27. }
  28. }
  29. int getbound ( int num, int *bound_u ) //返回本结点的c限界和u限界
  30. {
  31. for ( int w =curw, p =curp ; num <number && (w +bag [num ]. weight ) <=maxweight ; num ++ )
  32. {
  33. w =w +bag [num ]. weight ;
  34. p =w +bag [num ]. benefit ;
  35. }
  36. *bound_u =p +bag [num ]. benefit ;
  37. return ( p +bag [num ]. benefit * ((maxweight w ) /bag [num ]. weight ) ) ;
  38. }
  39. void LCbag ()
  40. {
  41. int bound_u = 0, bound_c = 0 ; //当前结点的c限界和u限界
  42. for ( int i = 0 ; i <number ; i ++ ) //逐层遍历解树决定是否装入各个物品
  43. {
  44. if ( ( bound_c =getbound (i + 1, &bound_u ) ) >upbound ) //遍历左子树
  45. upbound =bound_u ; //更改已有u限界,不更改标志
  46. if ( getbound (i, &bound_u ) >bound_c ) //遍历右子树
  47. //若装入,判断右子树的c限界是否大于左子树根的c限界,是则装入
  48. {
  49. upbound =bound_u ; //更改已有u限界
  50. curp =curp +bag [i ]. benefit ;
  51. curw =curw +bag [i ]. weight ; //从已有重量和效益加上新物品
  52. bag [i ]. flag = 1 ; //标记为装入
  53. }
  54. }
  55. }
  56. void Display ()
  57. {
  58. cout << “可以放入背包的物品的编号为:” ;
  59. for ( int i = 0 ; i <number ; i ++ )
  60. if (bag [i ]. flag > 0 )
  61. cout <<i + 1 << ” “ ;
  62. cout <<endl ;
  63. delete []bag ;
  64. }
    原文作者:分支限界法
    原文地址: https://blog.csdn.net/iteye_8601/article/details/81764511
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞