有 N 个任务,需要随机分配到 M 天,每天分配的任务大于等于 0 且小于等于 S,这个算法要怎么实现?

例如:
现在有15个任务,需要随机分配到 30 天中去,每天分配到的任务要大于等于 0 且小于等于 3。

另外需要保证不会出现前面几天就把任务全部分配完的情况,比如前面 10 天就把 15 个任务分配完了。

我尝试过自己去实现,奈何算法底子太差,好几天都没头绪。

请问各位这个能实现吗?如果能实现还请麻烦请给出思路或者伪代码或者 JavaScript 实现,谢谢!

阅读 2.9k
1 个回答

如果是真正随机,按理,前几天就把任务分配完是可以接受的啊。
我能想到的就是一个洗牌算法来实现,算法大致是这样的:

  1. 建立一个包含所有可工作日期的有序数组X
  2. 通过随机洗牌算法,打乱数组顺序获得新的X
  3. 则前面N天是肯定要安排工作的(伪代码)
/* 前面 已经处理获得了X数组*/
var A=new Array( 30 ); // 数组
var S=15;// 任务总量
for(let i=0;i<30;i++){
   let c=(S===0)?0:Math.floor(Math.random()*3+1);// 取[1,3]的随机整数作为待分配量
   c=(c>S)?S:c;
   A[i]=c;
   S=S-c;
}   


/*至此,X和A就是有了一一对应关系,每个日期的任务量是对应的*/
已参与了 SegmentFault 思否「问答」打卡,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题