Fork me on GitHub
#clojure-russia
<
2016-11-23
>
andmed16:11:54

небольшой off про кложу и алгоритмы. вот например решение knapsack подсмотренное на hackerrank. их всего два там. русский и американец)

(ns hackerrank.knapsack
  (:require  [clojure.set    :refer [union]]
             [clojure.string :refer [split]])
  (:import java.util.PriorityQueue))
(defn read-ints [] (map #(Long/parseLong %) (split (read-line) #"\s+")))
(dotimes [t (first (read-ints))]
  (let [[n k]   (read-ints)
        xs      (read-ints)
        q       (PriorityQueue. [0])]
    (println (loop [prev nil] (if (empty? q) prev
      (let [next (.poll q)]
        (when-not (= next prev) (some->> (filter #(<= % k) (map #(+ next %) xs)) (.addAll q)))
        (recur next)))))))
(defn solve [n W ws]
  (letfn [(subsolve [m w]
            (->> ws
                (filter (partial >= w))
                (map #(+ (m (- w %)) %))
                (reduce max 0)
                (conj m)))]
    ((reduce subsolve [0] (range 1 (inc W))) W)))

(dotimes [_ (read-string (read-line))]
  (let [[n W] (read-string (str "[" (read-line) "]"))
        ws (read-string (str "[" (read-line) "]"))]
    (println (solve n W ws))))

andmed16:11:44

два решения в смысле

andmed16:11:24

упаковка