Problema de Ullman
Definir la función
1 |
ullman :: (Num a, Ord a) => a -> Int -> [a] -> Bool |
tal que (ullman t k xs) se verifica si xs tiene un subconjunto con k elementos cuya suma sea menor que t. Por ejemplo,
1 2 3 4 |
ullman 9 3 [1..10] == True ullman 5 3 [1..10] == False ullman 9 5 [1..10^6] == False ullman 29 5 [1..10^6] == True |
Soluciones
[schedule expon=’2017-06-13′ expat=»06:00″]
- Las soluciones se pueden escribir en los comentarios hasta el 13 de junio.
- El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>
[/schedule]
[schedule on=’2017-06-13′ at=»06:00″]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import Data.List (sort, subsequences) -- 1ª solución ullman1 :: (Num a, Ord a) => a -> Int -> [a] -> Bool ullman1 t k xs = (not . null) [ys | ys <- subsequences xs, length ys == k, sum ys < t] -- 2ª solución ullman2 :: (Ord a, Num a) => a -> Int -> [a] -> Bool ullman2 t k xs = sum (take k (sort xs)) < t -- Comparación de eficiencia -- λ> ullman1 9 5 [1..23] -- False -- (10.73 secs, 1,761,726,376 bytes) -- λ> ullman2 9 5 [1..23] -- False -- (0.01 secs, 0 bytes) |
[/schedule]
6 Comentarios