> 백엔드 개발 > PHP 튜토리얼 > 이 간단한 알고리즘을 도와주세요.

이 간단한 알고리즘을 도와주세요.

WBOY
풀어 주다: 2016-09-19 09:16:25
원래의
1028명이 탐색했습니다.

글이 좋지 않습니다. 개선해주세요
사용자 ID 배열

<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>
로그인 후 복사
로그인 후 복사

이 배열의 각 키 값은 UID를 나타냅니다.
Amount 배열

<code>$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];</code>
로그인 후 복사
로그인 후 복사

이 배열의 키 이름은 $uid 배열의 키 값에 해당합니다.
$uids 배열을 반복하여 해당 금액인 $amount를 꺼냅니다.
금액이 12000($boundary)보다 크거나 같으면 총 금액($totals)에 $amount를 더합니다.
금액이 12000보다 작으면 이 $amounts의 합이 12000보다 크거나 같을 때까지 아래로 반복한 다음 이 $amounts의 합계를 총 금액($totals)
에 추가하고 최대 세 가지 수준.
마지막으로 $totals 값을 구합니다.
현재 코드:

<code><?php
$boundary = 12000;
$uids= [1,2,3,5,6,8,9,11,13,25,65];
$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];
$totals = 0;
foreach($uids as $k => $uid){
    $amont = $amounts[$uid];
    if($amont >= $boundary){
        $totals += $amont;
    }else{
        $next = get_next($uids ,$k+1 ,$amont);
        if($next && is_array($next)){
            $curKey = $next[0]; //amouts index 3
            $totals+=$next[2];
            //再向下获取一层
            $nextKey = $curKey+1;
            if(!isset($uids[$nextKey])){
                break;
            }
            $nextUid = $uids[$nextKey];
            $nextAmount = $amounts[$nextUid];
            if($nextAmount >= $boundary){
                $totals+=$nextAmount;
            }else{
                $last = get_next($uids ,$nextKey+1 ,$nextAmount);
                if($last && is_array($last)){
                    $totals+=$last[2];
                }
            }
        }
        break; //跳出主循环
    }
}
echo $totals;
exit;

function get_next($uids ,$start ,$prevAmount){
    global $amounts ,$boundary;
    $leaves = array_slice($uids ,$start ,count($uids),true);
    if($leaves){
        foreach($leaves as $k=>$uid){
            $amount = $prevAmount+$amounts[$uid];
            if($amount >= $boundary){
                return [$k ,$uid ,$amount];
                break;
            }else{
                return get_next($uids ,$k+1 ,$amount);
            }
        }
    }
    return 0;
}</code>
로그인 후 복사
로그인 후 복사

$totals=47500 가져오기

답글 내용:

글이 좋지 않습니다. 개선해주세요
사용자 ID 배열

<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>
로그인 후 복사
로그인 후 복사

이 배열의 각 키 값은 UID를 나타냅니다.
Amount 배열

<code>$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];</code>
로그인 후 복사
로그인 후 복사

이 배열의 키 이름은 $uid 배열의 키 값에 해당합니다.
$uids 배열을 반복하여 해당 금액인 $amount를 꺼냅니다.
금액이 12000($boundary)보다 크거나 같으면 총 금액($totals)에 $amount를 더합니다.
금액이 12000보다 작으면 이 $amounts의 합이 12000보다 크거나 같을 때까지 아래로 반복한 다음 이 $amounts의 합계를 총 금액($totals)
에 추가하고 최대 세 가지 수준.
마지막으로 $totals 값을 구합니다.
현재 코드:

<code><?php
$boundary = 12000;
$uids= [1,2,3,5,6,8,9,11,13,25,65];
$amounts = [
    1=>12000,
    2=>500,
    3=>11000,
    5=>1000,
    6=>11000,
    8=>12000,
    9=>12000,
    11=>11000,
    13=>12000,
    25=>22000,
    65=>123123
];
$totals = 0;
foreach($uids as $k => $uid){
    $amont = $amounts[$uid];
    if($amont >= $boundary){
        $totals += $amont;
    }else{
        $next = get_next($uids ,$k+1 ,$amont);
        if($next && is_array($next)){
            $curKey = $next[0]; //amouts index 3
            $totals+=$next[2];
            //再向下获取一层
            $nextKey = $curKey+1;
            if(!isset($uids[$nextKey])){
                break;
            }
            $nextUid = $uids[$nextKey];
            $nextAmount = $amounts[$nextUid];
            if($nextAmount >= $boundary){
                $totals+=$nextAmount;
            }else{
                $last = get_next($uids ,$nextKey+1 ,$nextAmount);
                if($last && is_array($last)){
                    $totals+=$last[2];
                }
            }
        }
        break; //跳出主循环
    }
}
echo $totals;
exit;

function get_next($uids ,$start ,$prevAmount){
    global $amounts ,$boundary;
    $leaves = array_slice($uids ,$start ,count($uids),true);
    if($leaves){
        foreach($leaves as $k=>$uid){
            $amount = $prevAmount+$amounts[$uid];
            if($amount >= $boundary){
                return [$k ,$uid ,$amount];
                break;
            }else{
                return get_next($uids ,$k+1 ,$amount);
            }
        }
    }
    return 0;
}</code>
로그인 후 복사
로그인 후 복사

$totals=47500 가져오기

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿