이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
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];
					if (best[at - 1][i - copies * w] != Integer.MIN_VALUE) {
						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);
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |