답안 #469990

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
469990 2021-09-02T13:43:39 Z ImaginaryIQ Knapsack (NOI18_knapsack) Java 11
100 / 100
960 ms 59596 KB
import java.io.*;
import java.util.*;
 
public class knapsack {
	public static void main(String[] args) throws IOException {
		BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer initial = new StringTokenizer(read.readLine());
		int limit = Integer.parseInt(initial.nextToken());
		int typeNum = Integer.parseInt(initial.nextToken());
		HashMap<Integer, ArrayList<int[]>> byWeight = new HashMap<>();
		for (int t = 0; t < typeNum; t++) {
			StringTokenizer item = new StringTokenizer(read.readLine());
			int value = Integer.parseInt(item.nextToken());
			int weight = Integer.parseInt(item.nextToken());
			int amt = Integer.parseInt(item.nextToken());
			if (weight <= limit && amt > 0) {
				if (!byWeight.containsKey(weight)) {
					byWeight.put(weight, new ArrayList<>());
				}
				byWeight.get(weight).add(new int[] {value, amt});
			}
		}
 
		/*
		 * best[i][j] contains the most value we can
		 * get using j weight and the first i weight types
		 */
		long[][] best = new long[byWeight.size() + 1][limit + 1];
 
		best[0][0] = 0;
		int at = 1;
		for (var pair : byWeight.entrySet()) {
			int w = pair.getKey();
			ArrayList<int[]> items = pair.getValue();
			// sort items in reverse order by value
			items.sort(Comparator.comparingInt(i -> -i[0]));
			for (int i = 0; i <= limit; i++) {
				best[at][i] = best[at - 1][i];
				int copies = 0;
				int typeAt = 0;
				int currUsed = 0;
				long profit = 0;
				// go through as many items until we run out of items or usable weight
				while ((copies + 1) * w <= i && typeAt < items.size()) {
					copies++;
					profit += items.get(typeAt)[0];
						best[at][i] = Math.max(
							best[at][i],
							best[at - 1][i - copies * w] + profit
						);
					currUsed++;
					if (currUsed == items.get(typeAt)[1]) {
						currUsed = 0;
						typeAt++;
					}
				}
			}
			at++;
		}
 
		long mostValue = 0;
		for (int i = 0; i <= limit; i++) {
			mostValue = Math.max(mostValue, best[byWeight.size()][i]);
		}
		System.out.println(mostValue);
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 100 ms 9096 KB Output is correct
2 Correct 86 ms 8928 KB Output is correct
3 Correct 116 ms 10412 KB Output is correct
4 Correct 87 ms 9000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 91 ms 9104 KB Output is correct
2 Correct 125 ms 10336 KB Output is correct
3 Correct 127 ms 10392 KB Output is correct
4 Correct 99 ms 9252 KB Output is correct
5 Correct 93 ms 9092 KB Output is correct
6 Correct 145 ms 14568 KB Output is correct
7 Correct 141 ms 14416 KB Output is correct
8 Correct 135 ms 14316 KB Output is correct
9 Correct 142 ms 14564 KB Output is correct
10 Correct 139 ms 14400 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 91 ms 9104 KB Output is correct
2 Correct 125 ms 10336 KB Output is correct
3 Correct 127 ms 10392 KB Output is correct
4 Correct 99 ms 9252 KB Output is correct
5 Correct 93 ms 9092 KB Output is correct
6 Correct 145 ms 14568 KB Output is correct
7 Correct 141 ms 14416 KB Output is correct
8 Correct 135 ms 14316 KB Output is correct
9 Correct 142 ms 14564 KB Output is correct
10 Correct 139 ms 14400 KB Output is correct
11 Correct 90 ms 9188 KB Output is correct
12 Correct 142 ms 10468 KB Output is correct
13 Correct 126 ms 10628 KB Output is correct
14 Correct 95 ms 8928 KB Output is correct
15 Correct 91 ms 9136 KB Output is correct
16 Correct 144 ms 14960 KB Output is correct
17 Correct 138 ms 14412 KB Output is correct
18 Correct 171 ms 14572 KB Output is correct
19 Correct 142 ms 14984 KB Output is correct
20 Correct 161 ms 14844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 100 ms 9096 KB Output is correct
2 Correct 86 ms 8928 KB Output is correct
3 Correct 116 ms 10412 KB Output is correct
4 Correct 87 ms 9000 KB Output is correct
5 Correct 91 ms 9104 KB Output is correct
6 Correct 125 ms 10336 KB Output is correct
7 Correct 127 ms 10392 KB Output is correct
8 Correct 99 ms 9252 KB Output is correct
9 Correct 93 ms 9092 KB Output is correct
10 Correct 145 ms 14568 KB Output is correct
11 Correct 141 ms 14416 KB Output is correct
12 Correct 135 ms 14316 KB Output is correct
13 Correct 142 ms 14564 KB Output is correct
14 Correct 139 ms 14400 KB Output is correct
15 Correct 90 ms 9188 KB Output is correct
16 Correct 142 ms 10468 KB Output is correct
17 Correct 126 ms 10628 KB Output is correct
18 Correct 95 ms 8928 KB Output is correct
19 Correct 91 ms 9136 KB Output is correct
20 Correct 144 ms 14960 KB Output is correct
21 Correct 138 ms 14412 KB Output is correct
22 Correct 171 ms 14572 KB Output is correct
23 Correct 142 ms 14984 KB Output is correct
24 Correct 161 ms 14844 KB Output is correct
25 Correct 88 ms 9112 KB Output is correct
26 Correct 127 ms 10512 KB Output is correct
27 Correct 125 ms 10464 KB Output is correct
28 Correct 92 ms 9212 KB Output is correct
29 Correct 94 ms 9280 KB Output is correct
30 Correct 140 ms 14672 KB Output is correct
31 Correct 145 ms 14416 KB Output is correct
32 Correct 163 ms 14716 KB Output is correct
33 Correct 162 ms 14916 KB Output is correct
34 Correct 161 ms 14900 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 100 ms 9096 KB Output is correct
2 Correct 86 ms 8928 KB Output is correct
3 Correct 116 ms 10412 KB Output is correct
4 Correct 87 ms 9000 KB Output is correct
5 Correct 91 ms 9104 KB Output is correct
6 Correct 125 ms 10336 KB Output is correct
7 Correct 127 ms 10392 KB Output is correct
8 Correct 99 ms 9252 KB Output is correct
9 Correct 93 ms 9092 KB Output is correct
10 Correct 145 ms 14568 KB Output is correct
11 Correct 141 ms 14416 KB Output is correct
12 Correct 135 ms 14316 KB Output is correct
13 Correct 142 ms 14564 KB Output is correct
14 Correct 139 ms 14400 KB Output is correct
15 Correct 90 ms 9188 KB Output is correct
16 Correct 142 ms 10468 KB Output is correct
17 Correct 126 ms 10628 KB Output is correct
18 Correct 95 ms 8928 KB Output is correct
19 Correct 91 ms 9136 KB Output is correct
20 Correct 144 ms 14960 KB Output is correct
21 Correct 138 ms 14412 KB Output is correct
22 Correct 171 ms 14572 KB Output is correct
23 Correct 142 ms 14984 KB Output is correct
24 Correct 161 ms 14844 KB Output is correct
25 Correct 88 ms 9112 KB Output is correct
26 Correct 127 ms 10512 KB Output is correct
27 Correct 125 ms 10464 KB Output is correct
28 Correct 92 ms 9212 KB Output is correct
29 Correct 94 ms 9280 KB Output is correct
30 Correct 140 ms 14672 KB Output is correct
31 Correct 145 ms 14416 KB Output is correct
32 Correct 163 ms 14716 KB Output is correct
33 Correct 162 ms 14916 KB Output is correct
34 Correct 161 ms 14900 KB Output is correct
35 Correct 629 ms 20576 KB Output is correct
36 Correct 722 ms 20692 KB Output is correct
37 Correct 671 ms 20484 KB Output is correct
38 Correct 743 ms 20984 KB Output is correct
39 Correct 658 ms 21568 KB Output is correct
40 Correct 775 ms 53368 KB Output is correct
41 Correct 828 ms 59596 KB Output is correct
42 Correct 869 ms 59516 KB Output is correct
43 Correct 901 ms 59548 KB Output is correct
44 Correct 930 ms 59508 KB Output is correct
45 Correct 756 ms 25316 KB Output is correct
46 Correct 456 ms 21096 KB Output is correct
47 Correct 880 ms 26940 KB Output is correct
48 Correct 960 ms 38064 KB Output is correct
49 Correct 572 ms 21500 KB Output is correct
50 Correct 627 ms 21548 KB Output is correct