500000元分给1000000个人,每个人分0.18到88元,正好分完。请问如何使用算法实现?

解决方案 »

  1.   

    简单的,复杂的搞不来,计算你那个 500000,1000000 要计算几分钟
    缺点,没有最大值,钱都比较平均,做个参考吧.....$res=redbag(500,1000,20,0.18);
    echo 'count:'.array_sum($res).'<br>';
    echo max($res).' - '.min($res);
    echo "<pre>";
    print_r($res);
    echo "</pre>";function redbag($money ,$count ,$max ,$min){
    $avg = $money / $count;
    if($max < $avg){
    $max = $avg;
    } $res=array();
    for($i = 0; $i < $count; $i++) {
    $tmpm = mrand($min, $max);
    $res[$i] = $tmpm;
    $money -= $tmpm;
    } while ($money > 0) {
    for ($i = 0; $i < $count; $i++) {
    if ($money > 0 && ($res[$i]+$avg) <= $max) {
    $res[$i] += $avg;
    $money -= $avg;
    }
    }
    };
    while ($money < 0) {
    for ($i = 0; $i < $count; $i++) {
    if ($money < 0 && ($res[$i]-$avg) >= $min) {
    $res[$i] -= $avg;
    $money += $avg;//money 0.019999999999999 在最后几步出现的,不知道是什么鬼,上一步是 -0.98 + 1
    }
    }
    }; if($money > 0){
    $res[0] += sprintf("%.2f", $money);
    }
    return $res;
    }function mrand($min,$max){
    $tmpmin = $min * 100;
    $tmpmax = $max * 100;
    return rand($tmpmin,$tmpmax) / 100;
    }
      

  2.   


    $arr = array(); //每个人所得的钱
    $k = 500 ;   //总金额
    $j = 1000 ;  //总人数
    $sum = 500 ; //剩余总数
    $surplus = 0 ;
    $s = 0 ; //剩余人数
    for($i=1;$i<=$j;$i++){
        $s = $j - $i ;
        if($s == 10){       
            $surplus = number_format($sum / $s,5);//只要控制最后的平均数,就可以做到在成本以下,不控制会高出小数点
            //$surplus = number_format($sum / $s,5) - 1;
        }
        if($s < 10){             
            $arr[$i] = $surplus;
            continue;
        }
        $rand = rand(18,800) / 100;    //随即金额
        
        if($sum / $s < $k / $j){        //如果当前金额/当前人数 < 总额的0.5 那么之后随即就在0.5以下随即.否则可以随即高数
            $rand = rand(18,50) / 100;
            $sum = $sum - $rand;
            $arr[$i] = $rand ;
        }else{
            $sum = $sum - $rand;
            $arr[$i] = $rand ;
        }
    }
    //print_r($arr);
    print_r(array_sum($arr));
    exit;我放小了100倍,,大概每次随即都只是多出小数点,也可以控制到金额以下, 也可以控制到完全OK. 
    后面就简单..我就不写了. 这样就差不多了.