Heim Backend-Entwicklung PHP-Tutorial php解决装箱问题

php解决装箱问题

Jul 25, 2016 am 08:51 AM

我对装箱问题,石头过河问题的解法
见http://www.oschina.net/question/117304_112681

实现思路主要为:
1. 大块石头必须优先装箱(早装和留到后面装都要装,先解决之)
2. 优先装重量接近w的
3. 同样重量优先装多块,如装9,6和装9,5,1比,则优先951装箱
4. 使用php的函数以简化代码,并使用根据k值生成函数的技巧
5. 此类问题由于本身性质,计算量较大,请酌情设置参数测试。

示例输出:(当rocks为1~9,w为15,k为3)
寻找由 3 个元素组成的最大解:
Array
(
[0] => 9
[1] => 5
[2] => 1
)

寻找由 2 个元素组成的最大解:
Array
(
[0] => 9
[1] => 6
)

寻找由 1 个元素组成的最大解:
Array
(
[0] => 9
)

寻找由 3 个元素组成的最大解:
Array
(
[0] => 8
[1] => 4
[2] => 3
)

寻找由 2 个元素组成的最大解:
Array
(
[0] => 8
[1] => 7
)

寻找由 1 个元素组成的最大解:
Array
(
[0] => 8
)

寻找由 3 个元素组成的最大解:
Array
(
[0] => 7
[1] => 6
[2] => 2
)

寻找由 2 个元素组成的最大解:
Array
(
[0] => 7
[1] => 6
)

寻找由 1 个元素组成的最大解:
Array
(
[0] => 7
)

最小次数:3
装船过程:Array
(
[0] => Array
(
[0] => 9
[1] => 5
[2] => 1
)

[1] => Array
(
[0] => 8
[1] => 4
[2] => 3
)

[2] => Array
(
[0] => 7
[1] => 6
[2] => 2
)

)
  1. // php 练习 之装箱问题
  2. // author: mx (http://my.oschina.net/meikaiyuan)
  3. // 2013/5/30
  4. // 问题:
  5. // http://www.oschina.net/question/117304_112681
  6. /*
  7. 题目:
  8. 以前问过类似问题,没有很好解答。所以想再问一次。
  9. 有大大小小的一堆石头要用船拉到河对岸
  10. --石头有m块,每块的重量已知
  11. --船每次只能装k块石头,并且装载重量不可以超过w
  12. --想求出最少几趟能把全部石头运过河。
  13. ------------------------------------
  14. 例1
  15. 石头有9块,重量分别是1,2,3,4,5,6,7,8,9
  16. k=3
  17. w=15
  18. 那么结果是,最少3次就可以运完。
  19. ------------------------------------
  20. 例2
  21. 石头有9块,重量分别是1,1,1,5,6,6,7,9,9
  22. k=3
  23. w=15
  24. 那么结果是,最少 4 次才可以运完。
  25. */
  26. //代码开始
  27. //石头
  28. global $rocks;
  29. // 船每次最多装几块
  30. global $k;
  31. // 船最大载重量
  32. global $w;
  33. $k=3;
  34. $rocks=array(1,2,3,4,5,6,7,8,9);
  35. // $rocks=array(1,1,1,5,6,6,7,9,9); //换成这组数据试试结果?
  36. $w=15;
  37. // 当前运了几次
  38. $count=0;
  39. // 运输过程,二维数组,形如 1=>array(9,5,1),表示第几次运了哪一些
  40. $process=array();
  41. // 求数组$rocks中一组合,使得最多$k个元素且这些元素的和尽可能大但小于等于指定值$w, 数组已经按从大到小排序过
  42. function getMaxCombination( ) {
  43. //石头
  44. global $rocks;
  45. // 船每次最多装几块
  46. global $k;
  47. // 船最大载重量
  48. global $w;
  49. // 保存各种$k下满足所有元素之和小于等于w且最大的集合
  50. $k_w_result=array();
  51. // 最大组合值
  52. $max_sum=0;
  53. // 哪项最大
  54. $max_one=0;
  55. for ($start=$k;$start>0;$start--){
  56. // 找到由固定$start个元素组成的最大解
  57. $start_w_arr = getMaxCombination2($start);
  58. echo "寻找由 $start 个元素组成的最大解: \n";
  59. print_r($start_w_arr);
  60. echo "\n";
  61. $sum=array_sum( $start_w_arr );
  62. // 注意:因为是降序排列的,$k--, 越早找到的同sum的组合$k越大,也就是解越好,所以是小于不是小于等于
  63. if($sum>$max_sum){
  64. $max_sum=$sum;
  65. $max_one=$k-$start;
  66. }
  67. $k_w_result[]= $start_w_arr ;
  68. }
  69. return $k_w_result[$max_one];
  70. }
  71. // 求数组$rocks中一由给定$start个元素构成的组合,这些元素的和尽可能大但小于等于指定值$w, 数组已经按从大到小排序过
  72. function getMaxCombination2($start ) {
  73. //石头们
  74. global $rocks;
  75. // 船每次最多装几块
  76. global $k;
  77. // 船最大载重量
  78. global $w;
  79. if(count($rocks) return array(0);
  80. }
  81. $c=count($rocks);
  82. // 根据$start生成一函数,内含$start层for循环代码, 然后包含进来再调用此函数
  83. if(!file_exists( "$start.php")){
  84. $output_1="";
  85. $output_2='$sum=';
  86. $output_3='if($sum $output_4='';
  87. for($i=0;$i $output_1.='for($p'.$i.'='.$i.';$p'.$i.' if($i>0){
  88. $output_2.='+';
  89. }
  90. $output_2.='$rocks[$p'.$i.']';
  91. $output_3.='$arr[]=$rocks[$p'.$i.'];';
  92. $output_4.='}';
  93. }
  94. $output_2.=';';
  95. $output_3.=' return $arr; }' ;
  96. $output='';
  97. file_put_contents("$start.php",$output);
  98. include_once "$start.php";
  99. }
  100. else{
  101. include_once "$start.php";
  102. }
  103. return call_user_func('myfor'.$start ,$rocks,$c,$w);
  104. }
  105. //开始计算
  106. // 数组先从大到小排序, 此操作是后续算法省时省力的关键
  107. rsort($rocks);
  108. // 为了防止石头过大船过小造成下面算法死循环
  109. foreach ($rocks as $v){
  110. if($v>$w){
  111. die("有石头不可能装船,换大船来再战!");
  112. }
  113. }
  114. // 算法开始
  115. while(!empty($rocks)){
  116. // 开始装一船
  117. $process[$count]=array();
  118. // 装船
  119. $process[$count]= getMaxCombination( ) ;
  120. // 从石头中移除已经装船的
  121. foreach($process[$count] as $v){
  122. $key=array_search($v, $rocks);
  123. unset( $rocks[$key]);
  124. }
  125. $rocks=array_values($rocks);
  126. // 装船数+1
  127. $count++;
  128. }
  129. // 输出结果
  130. echo '最小次数:'.$count."\n";
  131. echo '装船过程:';
  132. print_r($process);
  133. ?>
复制代码


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Apr 03, 2025 am 12:04 AM

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Erklären Sie das Konzept der späten statischen Bindung in PHP. Erklären Sie das Konzept der späten statischen Bindung in PHP. Mar 21, 2025 pm 01:33 PM

In Artikel wird die in PHP 5.3 eingeführte LSB -Bindung (LSB) erörtert, die die Laufzeitauflösung der statischen Methode ermöglicht, um eine flexiblere Vererbung zu erfordern. Die praktischen Anwendungen und potenziellen Perfo von LSB

Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Mar 31, 2025 pm 11:54 PM

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Wie sende ich eine Postanforderung mit JSON -Daten mithilfe der Curl -Bibliothek von PHP? Apr 01, 2025 pm 03:12 PM

Senden von JSON -Daten mithilfe der Curl -Bibliothek von PHP in der PHP -Entwicklung müssen häufig mit externen APIs interagieren. Eine der gängigen Möglichkeiten besteht darin, die Curl Library zu verwenden, um Post � ...

Rahmensicherheitsmerkmale: Schutz vor Schwachstellen. Rahmensicherheitsmerkmale: Schutz vor Schwachstellen. Mar 28, 2025 pm 05:11 PM

In Artikel werden wichtige Sicherheitsfunktionen in Frameworks erörtert, um vor Schwachstellen zu schützen, einschließlich Eingabevalidierung, Authentifizierung und regelmäßigen Aktualisierungen.

Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Anpassung/Erweiterung von Frameworks: So fügen Sie benutzerdefinierte Funktionen hinzu. Mar 28, 2025 pm 05:12 PM

In dem Artikel werden Frameworks hinzugefügt, das sich auf das Verständnis der Architektur, das Identifizieren von Erweiterungspunkten und Best Practices für die Integration und Debuggierung hinzufügen.

See all articles