Submission #1219973

#TimeUsernameProblemLanguageResultExecution timeMemory
1219973brito.joaoKnapsack (NOI18_knapsack)Java
0 / 100
52 ms11344 KiB
import java.util.*;
import java.io.*;

class Knapsack {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int S = Integer.parseInt(st.nextToken()); // max weight
        int N = Integer.parseInt(st.nextToken()); // number of item types
        
        List<Item> items = new ArrayList<>();
        
        // Read items and expand using binary lifting for large quantities
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int value = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            int count = Integer.parseInt(st.nextToken());
            
            // Binary lifting: break down large quantities into powers of 2
            int k = 1;
            while (k < count) {
                items.add(new Item(value * k, weight * k));
                count -= k;
                k *= 2;
            }
            if (count > 0) {
                items.add(new Item(value * count, weight * count));
            }
        }
        
        // Standard 0/1 knapsack DP on the expanded items
        long[] dp = new long[S + 1];
        
        for (Item item : items) {
            // Traverse backwards to avoid using the same item multiple times
            for (int w = S; w >= item.weight; w--) {
                dp[w] = Math.max(dp[w], dp[w - item.weight] + item.value);
            }
        }
        
        System.out.println(dp[S]);
    }
    
    static class Item {
        long value;
        int weight;
        
        Item(long value, int weight) {
            this.value = value;
            this.weight = weight;
        }
    }
}
#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...