前言
在工作中遇到了一个相当奇怪的要求。一开始,每个人自由组队完成任务,有些人超额完成,有些人未能完成,因此分数有多有少。为了能够尽可能多地减少工作量,需要重新分配队伍,实际上就是相互挂名,最后结算的时候抬过分数线。而有一个更奇怪的要求,就是组里面挂了名字之后,分数会被新来的平均分摊,多的人会变少,少的人会变多。
这下强度一下就上来了。
思考
整个过程很乱,但也没关系。我们一步步拆解。
拆解
既然难以思考,那就干脆拆成两个部分,分别是带约束减分(超额人员挂名)和带目标加分(未达标人员均摊)。
带约束减分这个过程也就可以看成一个0-1背包问题。
背包问题:
我现在有这么大的背包,然后有这么多东西,只能选择放入与不放入,那么能放多少。
现在这个问题:
现在部门有这么多的未达标人员,然后有这么多分数,只能选择挂名或不挂名,那么能挂多少。
简直太像了不是吗?
基本思路建模
既然这样,那我们就来试试建立一个数学模型。
对于人员 A A A,达标线为 s a s_a sa,超额完成后分数为 s 1 s_1 s1;如果本来只有他一个人,组内成员总数为 1 1 1,那么一个组可以获得的分数 s s s就全为个人所得;如果增加一个组员 B B B,则组内成员总数变为 2 2 2,那么 A A A 的分数变为:
s a ′ = s a − s 2 (1) s_a^{\prime}=s_a-\frac{s}{2}\tag{1} sa′=sa−2s(1)
同时,对于 B B B,本来只有 s b s_b sb,但是挂名后,分数变为:
s b ′ = s b + s 2 (1) s_b^{\prime}=s_b+\frac{s}{2}\tag{1} sb′=sb+2