贪婪问题2

13:有一艘大船准备用来装载货物。所有待装货物都装在货箱中且所有货箱的大小都一样,
但货箱的重量都各不相同。设第i 个货箱的重量为wi(1≤i≤n),
而货船的最大载重量为c,如何在货船上装入最多的货物。

 

 
 
  1. <?php  
  2. /*  
  3. *13:有一艘大船准备用来装载货物。所有待装货物都装在货箱中且所有货箱的大小都一样,  
  4. 但货箱的重量都各不相同。设第i 个货箱的重量为wi(1≤i≤n),  
  5. 而货船的最大载重量为c,如何在货船上装入最多的货物。  
  6. *系统环境:windows/linux  
  7. *编译环境:php4/php5  
  8. *输入参数:存放在in.txt,多个参数时空格分隔  
  9.                     参数1是一组数字,表示一组物品的重量 中间用分号分割;  
  10.                     重量,单位为千克,不能有0  
  11.                     参数3是一个数字,表示最大重量,单位为千克,  
  12.                     例如格式:8,2,11,3,7 13  
  13.     输出:out.txt  
  14. */ 
  15. $params=getParams(2);  
  16. $argv0=trim(trim($params[0]),",");  
  17. $argv1=trim($params[1]);  
  18. //检查参数1  
  19. if(!preg_match_all("/^(\d+,?)+$/i"$argv0,$matches))  
  20. {  
  21.     error_msg("params 1 must is group of numbers,break with ; and ,");  
  22. }  
  23. //检查参数2  
  24. if(!is_numeric($argv1))  
  25. {  
  26.     error_msg("params 2 must be a numbers");  
  27. }  
  28. $weights=split(",",trim($argv0","));  
  29. $max_weight=$argv1;  
  30. foreach($weights as $weight)  
  31. {  
  32.     if($weight==0)  
  33.     error_msg("weight must > 0");     
  34. }  
  35. $ar = array ($weights,array_keys($weights));  
  36. //按照重量从小到大排序  
  37. array_multisort($ar[0],SORT_NUMERIC, SORT_ASC,$ar[1]);  
  38. $weights_order=$ar[0];  
  39. $index_order=$ar[1];  
  40. $now_weight=0;  
  41. $i=0;  
  42. $total=count($weights_order);  
  43. $find=array();  
  44. while(1)  
  45. {  
  46.     if($now_weight+$weights[$i] <= $max_weight)  
  47.     {  
  48.         $now_weight+=$weights_order[$i];  
  49.           
  50.         //统计物品i的个数  
  51.         if(isset($find[$index_order[$i]]))  
  52.         {  
  53.             $find[$index_order[$i]]++;  
  54.         }else 
  55.         {  
  56.             $find[$index_order[$i]]=1;    
  57.         }  
  58.         if($now_weight==$max_weight)  
  59.         {  
  60.             break;    
  61.         }  
  62.     }else{  
  63.         $i++;  
  64.         if($i >= $total)  
  65.         {  
  66.             break;    
  67.         }  
  68.     }  
  69. }  
  70. //清空out.txt  
  71. output("",true);  
  72. if(count($find)==0)  
  73. {  
  74.     output("max weight too small",true);  
  75.     error_msg("execute success");  
  76. }  
  77. //输出结果  
  78. output("weight:$now_weight;");  
  79. foreach($find as $index => $num)  
  80. {  
  81.     output("物品 ".($index+1)."(".$weights[$index].") 的个数:$num");  
  82. }  
  83. error_msg("execute success");  
  84.  
  85. /*  
  86.     从in.txt里读取参数  
  87.       
  88. */ 
  89. function getParams($paramNum)  
  90. {  
  91.     $in=file_get_contents("in.txt");  
  92.     if($in===FALSE){  
  93.         error_msg("cannot read in.txt,please check in.txt exists\n");     
  94.     }  
  95.     $in=preg_replace("/(\s+)/i"" "$in);  
  96.     //多个参数时,按照空格分隔  
  97.     $parms=split(" ",trim($in));  
  98.     if($parms===FALSE)  
  99.     {  
  100.         error_msg("cannot get param from in.txt\n");  
  101.     }  
  102.     if(count($parms) < $paramNum)  
  103.     {  
  104.         error_msg("it needs $paramNum params\n");  
  105.     }  
  106.     return $parms;  
  107. }  
  108.  
  109. /*  
  110.     把结果输出到输出文件里  
  111.     当isClean=true时清空out.txt  
  112. */ 
  113. function output($msg,$isClean=false)  
  114. {  
  115.     if($isClean)  
  116.     {  
  117.     $handle = fopen('out.txt''w');  
  118.     fclose($handle);      
  119.     }  
  120.     error_log($msg."\n", 3, "out.txt");  
  121. }  
  122. /*  
  123.     输入错误信息  
  124.     如果$is_exit表示输入信息后退出  
  125. */ 
  126. function error_msg($msg,$is_exit=true)  
  127. {  
  128.     if($is_exit)  
  129.         die($msg."\n");  
  130.     else 
  131.         echo $msg."\n";  
  132. }  
  133. ?> 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值