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

发布于 2022-09-12 23:23:31 字数 210 浏览 17 评论 0

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜清冷一曲。 2022-09-19 23:23:31

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

  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 思否「问答」打卡,欢迎正在阅读的你也加入。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文