整数分配计算方法
作者:AntoniotheFuture
关键词:整数、任务分配,算法
开发平台:不限
开发语言:不限
简介:使用算法对一个整数按一组比例分配,要求分配后每一项都是整数(尽可能符合比例),且其和等于总数。
现有一个算法应用题:某公司全年的业绩目标为新增M (M为整数)个客户。小明要尽可能地把这个目标按一组确定的百分比数字(数组[K])将全年目标分配到每个月(找最优解),要求每个月的目标都是整数,每个月目标之和等于全年目标,试求算法。
再比如,老板有X个工人,他们的工资不一样,现在有M(M为整数)个生产任务,要按他们的工资比例分配到每个人,试求算法。
在此问题中,我们可以发现,若是对一个整数直接进行系数分配,往往会出现非整数,显然,这个问题不能简单处理。
于是我想到这么一个算法:
1、将总数M按比例[K]分配后,对每个月的数值舍去小数,得到数组[n]。
2、M减去[n]的和得到差值N,请注意,这里的N是一定小于数组的长度(比如说12个月)。
3、得到的每个月数值[n]除以总数,得到实际占比,列为数组[K']。
4、将实际占比[K']与预期占比[K]的差,加上排序系数(可以用月份除以1000000),进行中国式排序得到排序结果[s]。
5、遍历排序结果[s],如果小于N就为1,如果大于N,就为0。写入数组[t]。
6、将数组[t]加回[n],得到结果数组[b],即为最后分配结果。
通俗来说,就是分配后舍去小数点,跟預期的比率差别大的,加回1。
下面我们来看看Excel中如何操作:
首先我们获得了一个总数和8个分配系数:
总数乘以系数,再舍去小数:
计算初步分配结果后与总数的差:
计算每个分配结果占总数的比,然后用原参数减去,得到每个分配的差(也可以理解为舍去的小数占总数的占比),再加上排序参数,用于中国式排序(相同成绩不同位)
排序:
判断排名结果是否小于总差,正则为1,否为0,用于补回总差。
汇总结果,检验,显示是符合要求的:
也可以在程序中使用这个算法,具体怎么写就靠大家集思广益了。