php 数组分配的思路

解一个问题有H个苹果放到P个篮子里,苹果有标号,从1-H,且要求的结果是每个篮子都有苹果,苹果的标号要从小到大,且如果篮子中的数目不平均的话,要差值最小

大概是在各个样子

1. 

1 2 3

2.

4 5 6

3.

。。。。H

首先要确定怎么个放置的方法

用取余的方法,先确定每个篮子至少放多少个,取模不为0的话,将取模的值就是要多出1个苹果的篮子数,这样就可以计算出具体要怎么放



private function generatemap($lessonnum, $days){

$step2 = intval($lessonnum/$days);

$d1 = $lessonnum%$days;

$d2 = $days - $d1;

$step1 = $step2 + 1;

return array($d1."1" => $step1 , $d2."2" => $step2);//加一个标识,防止d1 等于 d2

}

下面就是放置的问题
 


$q = 0;

$atag = 1;

foreach($map as $k => $v){

$k = substr($k,0,-1);

if(!($k == 0 or $v ==0)){

for($i = 0; $i < $k; $i++){//天数

for($z = 0;$z < $v; $z++ ){//课数

$temp[$i.$atag]['m'] = dayafter($i+1);

$temp[$i.$atag]['tag'] = $i;

$temp[$i.$atag]['info'][] = $lessons[$q];

$q = $q + 1;

}

}

}

$atag += 1;

}

 
这样temp就分成了理想的结构
info的子集就是每个篮子中的苹果
这么算是不是很笨?有没有更好的算法?
 

 

转载请注明本文链接:http://www.simapple.com/224.html