import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class pak { private static int naive; public static void main(final String[] args) { final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { reader.readLine(); final List<Integer> przedm = new LinkedList<Integer>(); final List<Integer> plec = new LinkedList<Integer>(); for (final String p : reader.readLine().trim().split("\\s+")) { przedm.add(Integer.parseInt(p)); } for (final String p : reader.readLine().trim().split("\\s+")) { plec.add(Integer.parseInt(p)); } Collections.sort(przedm, Collections.reverseOrder()); Collections.sort(plec, Collections.reverseOrder()); naive = naive(new LinkedList<Integer>(przedm), new LinkedList<Integer>(plec)); if(naive == -1){ System.out.println("NIE"); System.exit(0); } final int solution = naive == 1 ? 1 : resolve(przedm, plec, plec.remove(0), 0); if (solution != -1) { System.out.println(1 + solution); } else { System.out.println("NIE"); } } catch (IOException e) { e.printStackTrace(); } System.exit(0); } private static int naive(List<Integer> przedm, List<Integer> plec) { int plecNo = 0; while (!przedm.isEmpty()) { if (plec.isEmpty()) { return -1; } Iterator<Integer> pIter = przedm.iterator(); final int przedmiot = pIter.next(); pIter.remove(); int plecak = plec.remove(0); plecNo++; if (plecak < przedmiot) { return -1; } plecak -= przedmiot; while (plecak > 0 && pIter.hasNext()) { int next = pIter.next(); if (next <= plecak) { plecak -= next; pIter.remove(); } else { break; } } } return plecNo; } private static int resolve(List<Integer> przedm, List<Integer> plec, int currentCapacity, int curRes) { if(curRes > naive) return -1; if (przedm.isEmpty()) return 0; int res = -1; for (int i = 0; i < przedm.size(); i++) { final int cost = przedm.get(i); if(i > 0 && cost == przedm.get(i - 1)) continue; if (cost <= currentCapacity) { currentCapacity -= cost; przedm.remove(i); final int subSolution = resolve(przedm, plec, currentCapacity, curRes); if (subSolution != -1) { if (res == -1) { res = subSolution; } else { if(subSolution > res) { currentCapacity += cost; przedm.add(i, cost); break; } res = subSolution;// Math.min(res, subSolution); } } currentCapacity += cost; przedm.add(i, cost); } else { if (!plec.isEmpty()) { final int currentPlec = plec.remove(0); if (currentPlec >= (i == 0 ? cost : przedm.get(0))) { final int subSolution = resolve(przedm, plec, currentPlec, curRes + 1); if (subSolution != -1) { if (res == -1) { res = 1 + subSolution; } else { res = Math.min(res, 1 + subSolution); } } } plec.add(0, currentPlec); } break; } } return res; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class pak { private static int naive; public static void main(final String[] args) { final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { reader.readLine(); final List<Integer> przedm = new LinkedList<Integer>(); final List<Integer> plec = new LinkedList<Integer>(); for (final String p : reader.readLine().trim().split("\\s+")) { przedm.add(Integer.parseInt(p)); } for (final String p : reader.readLine().trim().split("\\s+")) { plec.add(Integer.parseInt(p)); } Collections.sort(przedm, Collections.reverseOrder()); Collections.sort(plec, Collections.reverseOrder()); naive = naive(new LinkedList<Integer>(przedm), new LinkedList<Integer>(plec)); if(naive == -1){ System.out.println("NIE"); System.exit(0); } final int solution = naive == 1 ? 1 : resolve(przedm, plec, plec.remove(0), 0); if (solution != -1) { System.out.println(1 + solution); } else { System.out.println("NIE"); } } catch (IOException e) { e.printStackTrace(); } System.exit(0); } private static int naive(List<Integer> przedm, List<Integer> plec) { int plecNo = 0; while (!przedm.isEmpty()) { if (plec.isEmpty()) { return -1; } Iterator<Integer> pIter = przedm.iterator(); final int przedmiot = pIter.next(); pIter.remove(); int plecak = plec.remove(0); plecNo++; if (plecak < przedmiot) { return -1; } plecak -= przedmiot; while (plecak > 0 && pIter.hasNext()) { int next = pIter.next(); if (next <= plecak) { plecak -= next; pIter.remove(); } else { break; } } } return plecNo; } private static int resolve(List<Integer> przedm, List<Integer> plec, int currentCapacity, int curRes) { if(curRes > naive) return -1; if (przedm.isEmpty()) return 0; int res = -1; for (int i = 0; i < przedm.size(); i++) { final int cost = przedm.get(i); if(i > 0 && cost == przedm.get(i - 1)) continue; if (cost <= currentCapacity) { currentCapacity -= cost; przedm.remove(i); final int subSolution = resolve(przedm, plec, currentCapacity, curRes); if (subSolution != -1) { if (res == -1) { res = subSolution; } else { if(subSolution > res) { currentCapacity += cost; przedm.add(i, cost); break; } res = subSolution;// Math.min(res, subSolution); } } currentCapacity += cost; przedm.add(i, cost); } else { if (!plec.isEmpty()) { final int currentPlec = plec.remove(0); if (currentPlec >= (i == 0 ? cost : przedm.get(0))) { final int subSolution = resolve(przedm, plec, currentPlec, curRes + 1); if (subSolution != -1) { if (res == -1) { res = 1 + subSolution; } else { res = Math.min(res, 1 + subSolution); } } } plec.add(0, currentPlec); } break; } } return res; } } |