summaryrefslogtreecommitdiff
path: root/kattis-open/knapsack/knapsack.c
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2024-02-28 18:00:30 +0100
committerMathias Magnusson <mathias@magnusson.space>2024-02-28 18:00:30 +0100
commit4e8ac826929117f95baeb37e1518773d1169d900 (patch)
tree8d83639b336ece6422e9f3391655db12f30d6013 /kattis-open/knapsack/knapsack.c
parentd4fcb8a4a815ce8c888c3e06330e9cff71e3c312 (diff)
downloadprogramming-problem-solving-4e8ac826929117f95baeb37e1518773d1169d900.tar.gz
Random uncommited stuff
Diffstat (limited to 'kattis-open/knapsack/knapsack.c')
-rw-r--r--kattis-open/knapsack/knapsack.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/kattis-open/knapsack/knapsack.c b/kattis-open/knapsack/knapsack.c
new file mode 100644
index 0000000..407b133
--- /dev/null
+++ b/kattis-open/knapsack/knapsack.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdbool.h>
+
+int max(int a, int b) {
+ int v[2] = { a, b };
+ return v[b > a];
+}
+
+int min(int a, int b) {
+ int v[2] = { a, b };
+ return v[b < a];
+}
+
+int ks[2001][2001], v[2000], w[2000];
+bool t[2001][2001];
+int main() {
+ int c, n;
+ while (scanf("%d %d", &c, &n) == 2) {
+ for (int i = 0; i < n; i++) {
+ scanf("%d %d", &v[i], &w[i]);
+ }
+
+ for (int j = 0; j < w[0] && j <= c; j++) {
+ ks[0][j] = 0;
+ t[0][j] = false;
+ }
+ for (int j = w[0]; j <= c; j++) {
+ ks[0][j] = v[0];
+ t[0][j] = true;
+ }
+
+ for (int i = 1; i < n; i++) {
+ for (int j = 0; j < w[i] && j <= c; j++) {
+ ks[i][j] = ks[i - 1][j];
+ t[0][j] = false;
+ }
+ for (int j = w[i]; j <= c; j++) {
+ int skip = ks[i - 1][j];
+ int take = ks[i - 1][j - w[i]] + v[i];
+ ks[i][j] = max(take, skip);
+ t[i][j] = take > skip;
+ }
+ }
+
+ int taken[2000];
+ int taken_count = 0;
+ int j = c;
+ for (int i = n - 1; i >= 0; i--) {
+ if (t[i][j]) {
+ taken[taken_count++] = i;
+ j -= w[i];
+ }
+ }
+ printf("%d\n", taken_count);
+ for (int i = taken_count - 1; i >= 0; i--) {
+ printf("%d%c", taken[i], i == 0 ? '\n' : ' ');
+ }
+ }
+}