제출 #799657

#제출 시각아이디문제언어결과실행 시간메모리
799657rocketsriKnapsack (NOI18_knapsack)Java
12 / 100
115 ms10860 KiB
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 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...