一道M个球放到N个盒子里的算法题


有两个集合, 一个集合里面有N个不同盒子, 另一个集合里面有M个球,

把M个球分配到N个盒子里.
盒子和球的特点: 每个盒子有不同编号, 即每个盒子都不同,容量无限;

球不能任意放, 每个球都带有一个list, 上面记着可以放这个球的盒子,

即每个球只能放到特定的某几个盒子.

要求尽量减少球最多的那个盒子里面的球数, 也就是尽量平均放~
只需要输出球数最多的那个盒子里面放的球的数量就好

求帮忙~实在想不出一个有效的算法...给个思路就好~

可能表述的不清楚, 加个input和output的格式方便大侠们理解
input:
3 6 //3盒子和6个球
1
2
3 //盒子编号1,2,3
a 2 //a球只能放2
b 1 3 //b球可以放在1也可以放在3
c 1 2 3
d 2 3
e 2
f 1

然后output就是2

 

还是挺复杂的,是个二分图匹配算法,而二分匹配的算法需要使用

网络流算 法,不知道你听说过这个没有,如果没听过的话最好先查

一下相关的资料。总的思路是:首先随便找出一个放法,求出一个

上界(或者直接取M作为上界也行);然 后用二分法,每次尝试每

个盒子里最多放K个球的时候能不能放下;用二分法找出K个球能放

下,K-1个球放不下的时候,就算出了最多盒子里球的最少数目。

首先按照数据构造一个二分图:左边是M个球,右边是N个盒子,

如果某个球能放入这个盒子,就在两个顶点中间连一条有向边,从

左到右。这种顶点分成两个集合、只有集合之间才有连接的称为二分图。
然后将二分图构造成一个网络
增加一个源点s、一个汇点t,源点s到所有左边的M个球的节点增加

一条有向边,流量限制为1;原来二分图中所有的有向边,流量限制

为1;右边N个盒子中每个节点到汇点t增加一条有向边,限制当前每个

盒子最多放的球数量为K的时候,流量限制为K。
对这个网络模型,求源点s到汇点t的最大流。如果最大流的流量为M,

说明M个球可以全都放进N个盒子里,K满足条件;否则K不满足条件。
至于网络流的解法,有增广路径和预留推进两种算法,对这个问题来说

两个算法的复杂度都是O(M^3)量级。再加上二分法的消耗,总的算法

复杂度为O(M^3logM)。虽然不算特别快但是比搜索还是强太多了。

 
 
如果m和n的值比较大, 不可能在可接受时间内找到最优解, 建议使用
元启发式算法, (Meta Heuristic), 例如模拟退火算法, 禁忌搜索等。
 
 
二分 + 贪心。。。。。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM