【PHP】演算法: 擷取滿足給定值的最優組合

來源:互聯網
上載者:User

標籤:else   整數   epo   print   --   dig   ash   func   部落格   

 PHP 擷取給定值的最優組合

 

方法 -   (藍洛提供,部落格地址: www.zhaorui.info)

<?php ini_set(‘error_reporting‘,‘E_ALL^E_NOTICE‘); $arr2 = array(    0 => array(        ‘id‘=>‘1‘,        ‘cur‘ => ‘15‘,        ‘cash‘ => ‘2‘    ),    1 => array(        ‘id‘=>‘2‘,        ‘cur‘ => ‘20‘,        ‘cash‘ => ‘2‘    ),    2 => array(        ‘id‘=> ‘3‘,        ‘cur‘ => ‘10‘,        ‘cash‘ => ‘2‘    ),    3 => array(        ‘id‘=> ‘4‘,        ‘cur‘ => ‘6.2‘,        ‘cash‘ => ‘10‘    ), ); $arr = array_column($arr2,‘cur‘); //迴圈取出,轉化成整數類型 foreach($arr as &$v){     $v = intval($v); } print_r($arr); unset($v);$maxSize = floor(23.6);//此處填寫要的值//$arr = array(15, 20, 10, 6,30,5,1,13,17,9);$result = array();$answers = array();$currSize = floor(23.6);//此處也填寫要的值$len = count($arr);for ($i = 0; $i < $len; $i++) {    $result[] = array();    for ($j = 0; $j <= $maxSize; $j++) {        $result[$i][$j] = 0;    }}//var_dump($result);die;for ($i = 0; $i <= $maxSize; $i++) {    for ($j = 0; $j < $len; $j++) {        if ($arr[$j] > $i) {            if ($j === 0) $result[$j][$i] = 0;            else $result[$j][$i] = $result[$j - 1][$i];        } else {            if ($j === 0) $result[$j][$i] = $arr[$j];            else $result[$j][$i] = max($result[$j - 1][$i], $result[$j - 1][$i - $arr[$j]] + $arr[$j]);        }    }}// 找出答案for ($i = $len - 1; $i >= 0 && $currSize !== 0; $i--) {    if ($result[$i][$currSize] - $result[$i - 1][$currSize - $arr[$i]] === $arr[$i]) {        $answers[] = $arr[$i];        $currSize -= $arr[$i];    }}print_r($answers);$arr3 = array();foreach($arr2 as $k=>$v){    if(in_array(intval($v[‘cur‘]),$answers)){        $arr3[$k]=$v;    }}print_r($arr3);

 

方法二: 

<?php    $result_flb = array(        array(‘id‘=>‘1‘,‘currency‘ => ‘15‘,‘cash‘ => ‘2‘,),        array(‘id‘=>‘2‘,‘currency‘ => ‘20‘,‘cash‘ => ‘2‘),        array(‘id‘=> ‘3‘,‘currency‘ => ‘10‘,‘cash‘ => ‘2‘),        array(‘id‘=> ‘4‘,‘currency‘ => ‘6‘,‘cash‘ => ‘10‘),     );     $arr = array_column($result_flb,‘currency‘);     //迴圈取出,轉化成floor類型     foreach($arr as &$v){         $v = floor($v);     }     unset($v);         $max = 23;   //想要的值    $re = digui($arr);    foreach ($re as $key => $value) {        if ($key <= $max) {            isset($result) || $result = [$key, $value];            if ($key > $result[0]) {                $result = [$key, $value];            }        }    }    isset($result) || $result = [0, []];     print_r($result); //列印答案function digui($arr, $re = []) {    if (count($arr) == 0) {        return [];    }    if (count($arr) == 1) {        $re[$arr[0]] = [$arr[0]];    }    if (count($arr) >= 2) {        $x = array_shift($arr);        $re[$x] = [$x];        for ($b = 0; $b < count($arr); $b++) {            $result = $x + $arr[$b];            $re[$result] = [$x, $arr[$b]];        }        $re = digui($arr, $re);        foreach ($re as $k => $v) {            if (!in_array($arr[0], $v)) {                array_unshift($v, $arr[0]);                $re[$arr[0] + $k] = $v;            }        }    }    return $re;}?>

 

【PHP】演算法: 擷取滿足給定值的最優組合

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.