# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1219969 | brito.joao | Knapsack (NOI18_knapsack) | Java | 0 ms | 0 KiB |
import java.util.*;
public class Main {
static int knapsack(int S, List<Item> items) {
int[] dp = new int[S + 1];
for (Item item : items) {
int value = item.value;
int weight = item.weight;
int count = item.count;
int k = 1;
while (count > 0) {
int take = Math.min(k, count);
int totalValue = take * value;
int totalWeight = take * weight;
for (int j = S; j >= totalWeight; j--) {
dp[j] = Math.max(dp[j], dp[j - totalWeight] + totalValue);
}
count -= take;
k <<= 1; // Multiply by 2
}
}
int max = 0;
for (int v : dp) max = Math.max(max, v);
return max;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int S = sc.nextInt();
int N = sc.nextInt();
List<Item> items = new ArrayList<>();
for (int i = 0; i < N; i++) {
int v = sc.nextInt();
int w = sc.nextInt();
int k = sc.nextInt();
items.add(new Item(v, w, k));
}
System.out.println(knapsack(S, items));
}
static class Item {
int value, weight, count;
Item(int value, int weight, int count) {
this.value = value;
this.weight = weight;
this.count = count;
}
}
}