이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
import java.util.*;
public class knapsack {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m=in.nextInt(), n=in.nextInt();
int[] a = new int[n];
int[] w = new int[n];
int[] freq = new int[n];
HashMap<Integer, ArrayList<int[]>> pairs = new HashMap<>(); //(weight, {value, frequency})
for(int i=0; i<n; i++) {
a[i]=in.nextInt();
w[i]=in.nextInt();
freq[i]=in.nextInt();
}
for(int i=0; i<n; i++) {
if(pairs.containsKey(w[i])) {
pairs.get(w[i]).add(new int[] {a[i], freq[i]});
}
else {
pairs.put(w[i], new ArrayList<>(Arrays.asList(new int[] {a[i], freq[i]})));
}
}
long[] dp = new long[m+1];
for(int i=0; i<m+1; i++) {
dp[i]=-1;
}
dp[0]=0;
for(int weight : pairs.keySet()) {
ArrayList<int[]> curr = pairs.get(weight);
curr.sort(Comparator.comparingInt(b -> b[b.length-1]));
}
for(int weight : pairs.keySet()) {
long sum=0;
for(int[] j : pairs.get(weight)) {
sum += j[1];
}
for(int i=m; i>=weight; i--) {
long f = (long)(i/weight);
if(dp[i-(int)(Math.min(f, sum)*weight)]!=-1) {
long c = dp[i-(int)(Math.min(f, sum)*weight)];
for(int[] j : pairs.get(weight)) {
long fr = j[1], val = j[0];
if(fr>f) {
c += f*val;
f=0;
break;
}
else {
c += fr*val;
f -= fr;
}
}
dp[i] = Math.max(dp[i], c);
}
}
}
long max=0;
for(int i=0; i<m+1; i++) {
max = Math.max(max, dp[i]);
}
System.out.println(max);
}
}
# | 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... |