제출 #725719

#제출 시각아이디문제언어결과실행 시간메모리
725719sushikidKnapsack (NOI18_knapsack)Java
100 / 100
803 ms59732 KiB
import java.util.*; import java.io.*; public class knapsack { public static void main(String[] args) throws IOException{ BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); PrintWriter pw = new PrintWriter(System.out); StringTokenizer st = new StringTokenizer(r.readLine()); int s = Integer.parseInt(st.nextToken()); int n = Integer.parseInt(st.nextToken()); HashMap<Integer, ArrayList<int[]>> weights = new HashMap<>(); //weight with respect to [price, amount] for (int i = 0; i < n; i++) { st = new StringTokenizer(r.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); int c = Integer.parseInt(st.nextToken()); if(!weights.containsKey(b)){ weights.put(b, new ArrayList<>()); } weights.get(b).add(new int[]{a, c}); } long[][] ans = new long[weights.size() + 1][s + 1]; for (int i = 0; i < ans.length; i++) { Arrays.fill(ans[i], Long.MIN_VALUE); } ans[0][0] = 0; long max = 0; int z = 1; for(int e : weights.keySet()){ ArrayList<int[]> possible = weights.get(e); Collections.sort(possible, (a, b) -> -Integer.compare(a[0], b[0])); for (int i = 0; i <= s; i++) { ans[z][i] = ans[z - 1][i]; int cur = 0; int at = 0; int total = 0; long profit = 0; while(i - (total + 1) * e >= 0 && cur < possible.size()){ total ++; profit += possible.get(cur)[0]; if(ans[z - 1][i - total * e] != Long.MIN_VALUE){ ans[z][i] = Math.max(ans[z][i], ans[z - 1][i - total * e] + profit); max = Math.max(ans[z][i], max); } at ++; if(at == possible.get(cur)[1]){ at = 0; cur ++; } } } z++; } pw.println(max); pw.close(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...