有兩個集合, 一個集合里面有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)。雖然不算特別快但是比搜索還是強太多了。