>백엔드 개발 >PHP 튜토리얼 >PHP는 복싱 문제를 해결합니다

PHP는 복싱 문제를 해결합니다

WBOY
WBOY원래의
2016-07-25 08:51:001189검색
포장 문제와 돌 교차 문제
에 대한 나의 해결책은 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개의 요소로 구성된 최대 해를 구합니다:
배열
(
[0] => 9
[1] => 6
)

1개의 요소로 구성된 최대 솔루션 찾기:
배열
(
[0] => 9
)

3개 요소로 구성된 최대 솔루션 찾기:
배열
(
[0] => 8
[1] = > 4
[2] => 3
)

2개 요소로 구성된 최대 솔루션 찾기:
배열
(
[0] => 8
[1] = > 7
)

1개의 요소로 구성된 최대 솔루션 찾기:
배열
(
[0] => 8
)

3개 요소로 구성된 최대 솔루션:
배열
(
[0] => 7
[1] => 6
[2] => 2
)

2개 요소로 구성된 최대값 찾기:
배열
(
[0] => 7
[1] => 6
)

최대값 찾기 1개 요소로 구성된 솔루션:
Array
(
[0] => 7
)

최소 횟수: 3
조립 선박 공정: Array
(
[0] => 배열
(
[0] => 9
[1] => 5
[2] => 1
)

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

[2 ] => 배열
(
[0] => 7
[1] => 6
[2] => 2
)

)
  1. // php 운동 복싱 문제
  2. // 작성자: 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. //Stones
  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. // 운송 과정, 2차원 배열, 형태로 1=>array(9 ,5,1), 어떤 항목이 여러 번 실행되었는지 나타냅니다.
  40. $process=array();
  41. // $rocks 배열에서 다음과 같은 조합을 찾습니다. 최대 $k개의 요소와 합계가 가능한 한 크지만 지정된 값 $w보다 작거나 같습니다. 배열은 큰 것에서 작은 것 순으로 정렬되었습니다.
  42. function getMaxCombination( ) {
  43. //Stones
  44. global $rocks;
  45. // 매번 배송 최대 적재 가능 개수
  46. global $k;
  47. // 선박의 최대 적재 용량
  48. global $w;
  49. // 모든 요소의 합이 w 및 가장 큰 집합보다 작거나 같도록 다양한 $k를 저장합니다.
  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--, 같은 합계를 갖는 조합 $k가 빠를수록 발견되면 클수록, 즉 해가 더 좋아지기 때문에
  63. if($sum>$max_sum) {
  64. $max_sum=$sum; $max_one=$k-$start;
  65. }
  66. $k_w_result[]= $start_w_arr ;
  67. }
  68. return $k_w_result[$max_one ];
  69. }
  70. // $rocks 배열에서 주어진 $start 요소의 조합을 찾습니다. 이 요소의 합은 가능한 한 크지만 지정된 값 $w보다 작거나 같습니다. 배열은 큰 것에서 작은 것으로 정렬되었습니다. 🎜>function getMaxCombination2($start) {
  71. //암석
  72. global $rocks;
  73. //선박이 한 번에 적재할 수 있는 최대 암석 수
  74. global $k;
  75. // 선박의 최대 적재 용량
  76. global $w;
  77. if(count($rocks)<$start){
  78. return array(0);
  79. }
  80. $ c=count($rocks);
  81. // 루프 코드에 대한 $start 레이어를 포함하는 $start를 기반으로 함수를 생성한 다음 이를 포함하고 이 함수를 호출합니다.
  82. if(!file_exists( "$start. php" )){
  83. $output_1="";
  84. $output_2='$sum=';
  85. $output_3='if($sum<=$w){ $arr=array(); ';
  86. $output_4='';
  87. for($i=0;$i<$start;$i ){
  88. $output_1.='for($p'.$i.'= '.$i.';$p'.$i.'<$c-'.($start-$i-1).';$p'.$i.' ){'."n";
  89. if($i>0){
  90. $output_2.=' ';
  91. }
  92. $output_2.='$rocks[$p'.$i.']';
  93. $output_3 .='$arr[]=$rocks[$p'.$i.'];';
  94. $output_4.='}';
  95. }
  96. $output_2.=';' ;
  97. $output_3.=' $arr 반환 }' ;
  98. $output='';
  99. file_put_contents("$start.php",$output);
  100. include_once "$start.php";
  101. }
  102. else{
  103. include_once "$start.php";
  104. }
  105. return call_user_func('myfor'.$start ,$rocks,$c,$w);
  106. }
  107. //계산 시작
  108. // 먼저 배열을 큰 것에서 작은 것 순으로 정렬합니다. 이 작업은 후속 알고리즘에서 시간과 노력을 절약하는 열쇠입니다
  109. rsort($rocks);
  110. // 바위가 지나가는 것을 방지하기 위해 대형 선박이 너무 작아서 다음 알고리즘의 무한 루프가 발생합니다.
  111. foreach ($rocks as $v){
  112. if($v>$w) {
  113. die("돌이 있으면 배에 실을 수 없습니다. 더 큰 배로 바꿔서 다시 싸워보세요! ");
  114. }
  115. }
  116. // 알고리즘 시작
  117. while(!empty($rocks)){
  118. // 선박 선적 시작
  119. $process[$ count]=array();
  120. // 배송
  121. $process[$count]= getMaxCombination( ) ;
  122. // 이미 배송된 foreach($ 프로세스[$count]를 $v){
  123. $key=array_search($v, $rocks);
  124. unset( $rocks[$key]);
  125. }
  126. $ Rocks=array_values( $rocks);
  127. // 배송 횟수 1
  128. $count ;
  129. }
  130. // 출력 결과
  131. echo '최소 횟수:'.$count."n" ;
  132. echo '배송 과정:';
  133. print_r($process);
  134. ?>
  135. 코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.