<div dir="ltr"><div class="gmail_extra">You don't want to do full search here. You want to do a "branch and bound" search, keeping track of the current best value (which suggests the State monad) and then terminating searches of subtrees when the best possible value for that subtree is worse than the current global best possible.</div><div class="gmail_extra"><br></div><div class="gmail_extra">I haven't looked into doing this in Haskell, but it should be a lot faster than trying to search the full tree.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 27, 2015 at 9:23 AM, Animesh Saxena <span dir="ltr"><<a href="mailto:animeshsaxena@icloud.com" target="_blank">animeshsaxena@icloud.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="font-size:15px">let cities = 6</div><div style="font-size:15px">let clinics = 10</div><div style="font-size:15px"><div>let populations = [1,10000,2,3,400,1]</div><div>let nparts n k = filter ((==n) . sum)  $ replicateM k [1..n]</div><div>let d2 = nparts clinics cities</div><div>let d1 = map maximum (map (\x -> zipWith (/) populations (map (\n-> fromIntegral n) x)) $ d2)</div></div><div style="font-size:15px"><div style="font-family:-apple-system-font;line-height:20px">maximum $ zipWith (\n x -> (n `div` x) + (n `mod` x) ) populations $ d2 !! (head $ filter ((==minimum d1) . (d1 !!)) [0..])</div><div></div></div></blockquote></div><br><br></div></div>