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