求一个算法

闪闪放光芒 2017-09-19 08:24:27


求一个算法:

现有代金券 1元、10元、100元、2000元、1000元、500元

客户A手上代金券600元、
客户B手上代金券900元、
客户C手上代金券400元、
客户D手上代金券800元、
客户F手上代金券2400元、

怎么分代金券让这5个客户最终手里代金券总金额尽量平均(可以有客户分不到也可以有客户分多张)。
代金券个数和客户人数不定(这里仅拿6个代金券和5个客户为例!)


...全文
525 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
闪闪放光芒 2017-09-20
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
$d = array(1,10,100,2000,1000,500);
$a = array(
'A'=>600,
'B'=>900,
'C'=>400,
'D'=>800,
'F'=>2400,
);
while($d) {
  while(max($a)*count($a) - array_sum($a) > array_sum($d)) {
    $k = array_search(max($a), $a);
    $r[$k] = $a[$k];
    unset($a[$k]);
  }
  $a[array_search(min($a), $a)] += max($d);
  $d = array_diff($d, array(max($d)));
}
$r = array_merge($r, $a);
print_r($r);

Array
(
    [F] => 2400
    [C] => 2400
    [A] => 1600
    [D] => 1300
    [B] => 1011
)
版主算法让我跪拜啊! 能说下这个是什么思路想到的 while(max($a)*count($a) - array_sum($a) > array_sum($d))
xuzuning 2017-09-20
  • 打赏
  • 举报
回复
如果每人都能补齐到现有的最大值的话,那么需要 max($a)*count($a) - array_sum($a) 有待分配总和 array_sum($d)
xuzuning 2017-09-20
  • 打赏
  • 举报
回复
$d = array(1,10,100,2000,1000,500);
$a = array(
'A'=>600,
'B'=>900,
'C'=>400,
'D'=>800,
'F'=>2400,
);
while($d) {
  while(max($a)*count($a) - array_sum($a) > array_sum($d)) {
    $k = array_search(max($a), $a);
    $r[$k] = $a[$k];
    unset($a[$k]);
  }
  $a[array_search(min($a), $a)] += max($d);
  $d = array_diff($d, array(max($d)));
}
$r = array_merge($r, $a);
print_r($r);

Array
(
    [F] => 2400
    [C] => 2400
    [A] => 1600
    [D] => 1300
    [B] => 1011
)

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧