Advertisement
Guest User

backpack

a guest
Sep 28th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 1.52 KB | None | 0 0
  1. import java.util.stream.Collectors
  2.  
  3. def memo = new HashMap<List<Integer>, Integer>()
  4. def N = 8
  5. def input = new IntRange(false, 0, N).collect { (Math.random() * 1000).intValue() }
  6. println input
  7.  
  8. def getKey(Integer i, Integer w) {
  9.     return Arrays.asList(i, w)
  10. }
  11.  
  12. Integer m(Integer i, Integer w, List<Integer> input, Map<List<Integer>, Integer> memo) {
  13.     def key = Arrays.asList(i, w)
  14.     if (memo.containsKey(key)) {
  15.         return memo.get(key)
  16.     }
  17.  
  18.     if (i == -1) {
  19.         return 0
  20.     }
  21.  
  22.     if (input.get(i) > w) {
  23.         def value = m(i - 1, w, input, memo)
  24.         memo.put(key, value)
  25.         return value
  26.     }
  27.  
  28.     def value = Math.max(
  29.             m(i - 1, w, input, memo),
  30.             m(i - 1, w - input.get(i), input, memo) + input.get(i)
  31.     )
  32.     memo.put(key, value)
  33.     return value
  34. }
  35.  
  36. def ans(Integer i, Integer w, List<Integer> input, Map<List<Integer>, Integer> memo, List<Integer> output) {
  37.     if (i == -1) {
  38.         return
  39.     }
  40.  
  41.     if (memo.get(getKey(i, w)) == memo.get(getKey(i - 1, w))) {
  42.         ans(i - 1, w, input, memo, output)
  43.     } else {
  44.         output.push(input.get(i))
  45.         ans(i - 1, w - input.get(i), input, memo, output)
  46.     }
  47. }
  48.  
  49. def average = input.stream().collect(Collectors.averagingInt { it }).intValue()
  50. def ref = (average * N * 3 / 4).intValue()
  51. println average
  52. println "ref: $ref"
  53. println m(input.size() - 1, ref, input, memo)
  54.  
  55. def result = new ArrayList<Integer>()
  56. ans(input.size() - 1, ref, input, memo, result)
  57. println "anwser: $result"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement