日期:2014-05-18  浏览次数:20929 次

求一个最优分配算法
数据库记录如下
姓名 金额
张三 100
李四 50
...
王五 800

n条记录,可能会上万条
现在我要把这些记录分配给若干业务员,要求每个业务员拿到的记录数和总金额相当,求最优算法。

------解决方案--------------------
设记录条数为n, 业务员人数为 m

1、初始化各业务员的当前总金额全为0 ;将记录按“金额”从大到小排序,得到序列list

2、若list 为null,转至步骤4 ; 否则,取list前m 条,按序分派给各业务员,金额加入各业务员的当前金额中。将该m条记录从list中移去。

3、业务员按当前总金额按从小到大排序。

4、输出各业务员拿到的纪录。

时间复杂度: O( nlog(m) )
------解决方案--------------------
我认为LZ的命题有些地方值得商榷...在记录条数,以及平均分配金额上应有一项为最高优先度,因为实际数据的统计分布不确定,
假设数据为
$1
$1
$9
$2
$2
$1
按平均分配金额看假设销售为2人此系列应最接近平均值$8
可能分得的记录
1,1,2,2,1和9最合理...
不知道LZ对此序列打算如何分配呢?

------解决方案--------------------
那就用最初级的人工智能来解决这个问题..权值法
按LZ的需求每条记录的权值可以是
首先获得所有记录的金额合计,然后除以销售人员数量得到权的基准数..
比如上例为(1+1+9+2+2+1)/2=8
按需求计算每条记录得权值
这个公式我给出的是 权=记录权+金额权
其中:记录权=基准数*系数 (系数为记录权的优先级越大表示记录的权越高,可以在实践中调整)
在这里我假定系数为2;
金额权=金额;
这个系列的权就为
$1 17
$1 17
$9 25
$2 18
$2 18
$1 17

按权从大到小排序
$9 25
$2 18
$2 18
$1 17
$1 17
$1 17


按权最小得顺序分配
初始化
0 业务员A 权合计0 业务员B 权合计0
1 业务员A 权合计25 业务员B 权合计0
$9 25

2 业务员A 权合计25 业务员B 权合计18
$9 25 $2 18

3 业务员A 权合计25 业务员B 权合计36
$9 25 $2 18
$2 18
4 业务员A 权合计42 业务员B 权合计36
$9 25 $2 18
$1 17 $2 18

5 业务员A 权合计42 业务员B 权合计53
$9 25 $2 18
$1 17 $2 18
$1 17
6 业务员A 权合计59 业务员B 权合计53
$9 25 $2 18
$1 17 $2 18
$1 17 $1 17

第6步为最终结果
可以看到记录被平均分配,金额为 A=11,B=5,这样的结果不知道LZ是否可以接受,通过调整系数可以更合理的调整结果..
注:以上数据都可以使用Float来更精确的比较,系数小于1可以理解为金额的权大于记录数的权