diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2024-02-28 18:00:30 +0100 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2024-02-28 18:00:30 +0100 |
commit | 4e8ac826929117f95baeb37e1518773d1169d900 (patch) | |
tree | 8d83639b336ece6422e9f3391655db12f30d6013 /kattis-open/knapsack/knapsack.c | |
parent | d4fcb8a4a815ce8c888c3e06330e9cff71e3c312 (diff) | |
download | programming-problem-solving-4e8ac826929117f95baeb37e1518773d1169d900.tar.gz |
Random uncommited stuff
Diffstat (limited to 'kattis-open/knapsack/knapsack.c')
-rw-r--r-- | kattis-open/knapsack/knapsack.c | 59 |
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' : ' '); + } + } +} |