为了账号安全,请及时绑定邮箱和手机立即绑定

求配货组合的最优算法

求配货组合的最优算法

C PHP
yaoke 2017-12-14 18:16:15
假设商品编码如下: Array (     [0] => A     [1] => B     [2] => C     [3] => D     [4] => E     [5] => F     [6] => G     [7] => H     [8] => I     [9] => J     [10] => K     [11] => L     [12] => M     [13] => N     [14] => O ) 商品库存: Array (     [A] => 34     [B] => 37     [C] => 27     [D] => 25     [E] => 45     [F] => 24     [G] => 37     [H] => 40     [I] => 49     [J] => 34     [K] => 49     [L] => 23     [M] => 44     [N] => 31     [O] => 22 ) 100个用户申请发货,至少两件商品才可以申请发货,发货清单如下 Array (     [0] => HII     [1] => ACDI     [2] => AG     [3] => AD     [4] => DG     [5] => ADDFG     [6] => BGI     [7] => DDFGI     [8] => AACEJ     [9] => ABC     [10] => ABD     [11] => AABF     [12] => BFGJ     [13] => CEGHI     [14] => AEFFF     [15] => AFGH     [16] => EH     [17] => CE     [18] => AD     [19] => FHHIJ     [20] => BDDHJ     [21] => CEFJJ     [22] => AB     [23] => CH     [24] => ACEJ     [25] => ABC     [26] => HI     [27] => AAEFIJ     [28] => ADII     [29] => BFFJ     [30] => DDHHJ     [31] => EGJJ     [32] => DG     [33] => AAABFH     [34] => BJ     [35] => CG     [36] => CI     [37] => FG     [38] => FFGGJJ     [39] => CFFH     [40] => BDFF     [41] => CDFH     [42] => DEG     [43] => ACEG     [44] => CGI     [45] => AEEI     [46] => AACFGH     [47] => FGG     [48] => ACDFHJ     [49] => ABHH     [50] => CDIIJ     [51] => BCD     [52] => AEFHHI     [53] => EEEH     [54] => AACEFH     [55] => DDEGHJ     [56] => GHJJJ     [57] => BEFJJ     [58] => DEHIJJ     [59] => ABDJ     [60] => BE     [61] => BEEGGI     [62] => AFJ     [63] => FF     [64] => AE     [65] => ABEJ     [66] => AIJJ     [67] => AE     [68] => CHJ     [69] => ACHII     [70] => AAEFGJ     [71] => FG     [72] => AEH     [73] => EF     [74] => EG     [75] => EGHI     [76] => DFG     [77] => ABDHI     [78] => BDE     [79] => EEGIJJ     [80] => AAADGG     [81] => FFF     [82] => AI     [83] => ACEFJ     [84] => AACDEF     [85] => EEGIIJ     [86] => BF     [87] => AD     [88] => BEJJ     [89] => DDEEFF     [90] => BFGII     [91] => BDDE     [92] => BCCDIJ     [93] => AACCCH     [94] => AABFG     [95] => CDHIJ     [96] => BCDEGJ     [97] => DEHJ     [98] => EFG     [99] => BEEFI ) 求已知上述商品库存的情况下,可以发出的最大包裹数是多少
查看完整描述

1 回答

?
灬紫羽

TA贡献107条经验 获得超71个赞

<?php
# 以下纯属个人见解,算法或许不是最优,欢迎各位大佬点评
# 商品数组
$goods = array('A','B','C');
# 商品库存数组
$store = array('A' => 4, 'B' => 3, 'C' => 2);
$tmp = []; # 记录商品添加的次数
$result = []; # 表示各种组合
# i 表示最少几个商品组合
for ($i = 2 ;$i <= 4 ; $i ++  ){
    $combines    = Combination($goods,$i);
    $result = array_merge($result,$combines);
}
# 反转,键从小到大的商品为 最多组合的商品 到 最少商品的组合
$result = array_reverse($result);
# 验证库存
foreach ($result as $key => $item){
    $flag = false; # 表示是否删除此项
    $com = explode('---',$item);
    foreach ($com as $v){
        if(in_array($v,array_keys($tmp))){
            if($tmp[$v] >= $store[$v]) {
                $flag = true;
                continue;
            } else {
                $tmp[$v] += 1;
            }
        } else {
            $tmp[$v] = 1;
        }
    }
    if($flag) unset($result[$key]);
}

/*从数组中拿出组合数*/
function Combination($sort, $num)
{
    $result = $data = array();
    if( $num == 1 ) {
        return $sort;
    }
    foreach( $sort as $k=>$v ) {
        unset($sort[$k]);
        $data   = Combination($sort,$num-1);
        foreach($data as $row) {
            $result[] = $v.'---'.$row;
        }
    }
    return $result;
}

https://img1.sycdn.imooc.com//5cd292260001bbed08440202.jpg

https://img1.sycdn.imooc.com//5cd292260001726b08500176.jpg


查看完整回答
1 反对 回复 2019-05-08
  • 1 回答
  • 0 关注
  • 1468 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信