一道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