zoukankan      html  css  js  c++  java
  • 【PHP】算法: 获取满足给定值的最优组合

     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;
    }
    
    
    
    ?>
  • 相关阅读:
    Fast AutoAugment阅读笔记
    object as point阅读笔记
    Hardware-in-the-loop End-to-end Optimization of Camera Image Processing Pipelines阅读笔记
    TP框架使用命令行
    shopee常见的刊登报错问题
    TP执行队列的命令
    正则匹配手机号码
    时间格式化转换
    使用fixed定位将元素(如按钮)悬浮在页面底部
    LNMP一键安装教程
  • 原文地址:https://www.cnblogs.com/richerdyoung/p/7979206.html
Copyright © 2011-2022 走看看