#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
// baca seluruh input dari stdin ke buffer
char buf[2000];
size_t pos = 0;
buf[0] = '\0';
while (fgets(buf
+ pos
, sizeof(buf
) - pos
, stdin
)) { if (pos >= sizeof(buf)-1) break;
// jika sudah membaca satu baris penuh, tetap kumpulkan seluruh input (toleran)
}
// ganti koma dengan spasi untuk memudahkan parsing
for (size_t i
= 0; i
< strlen(buf
); ++i
) { if (buf[i] == ',') buf[i] = ' ';
}
// tokenisasi dan konversi semua integer yang ada
int nums[1000];
int cnt = 0;
char *tok
= strtok(buf
, " \t\r\n"); while (tok) {
char *endptr;
long val
= strtol(tok
, &endptr
, 10); if (endptr != tok) {
nums[cnt++] = (int)val;
}
tok
= strtok(NULL
, " \t\r\n"); }
if (cnt < 1) return 0;
int idx = 0;
int n = nums[idx++]; // jumlah item
if (cnt < 1 + 2*n + 1) {
// input tidak lengkap
return 0;
}
int *w
= (int*)malloc(sizeof(int) * n
); int *v
= (int*)malloc(sizeof(int) * n
); if (!w || !v) return 0;
for (int i = 0; i < n; ++i) w[i] = nums[idx++];
for (int i = 0; i < n; ++i) v[i] = nums[idx++];
int cap = nums[idx++];
if (cap < 0) cap = 0;
// DP 0-1 knapsack (memaksimalkan nilai)
// gunakan array 1D untuk efisiensi: dp[j] = maksimum nilai untuk kapasitas j
int *dp
= (int*)calloc(cap
+ 1, sizeof(int)); if (!dp) {
return 0;
}
for (int i = 0; i < n; ++i) {
int wi = w[i];
int vi = v[i];
// iterasi mundur agar 0-1 knapsack benar
for (int j = cap; j >= wi; --j) {
int cand = dp[j - wi] + vi;
if (cand > dp[j]) dp[j] = cand;
}
}
// hasil optimal = dp[cap]
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKaW50IG1haW4oKSB7CiAgICAvLyBiYWNhIHNlbHVydWggaW5wdXQgZGFyaSBzdGRpbiBrZSBidWZmZXIKICAgIGNoYXIgYnVmWzIwMDBdOwogICAgc2l6ZV90IHBvcyA9IDA7CiAgICBidWZbMF0gPSAnXDAnOwogICAgd2hpbGUgKGZnZXRzKGJ1ZiArIHBvcywgc2l6ZW9mKGJ1ZikgLSBwb3MsIHN0ZGluKSkgewogICAgICAgIHBvcyA9IHN0cmxlbihidWYpOwogICAgICAgIGlmIChwb3MgPj0gc2l6ZW9mKGJ1ZiktMSkgYnJlYWs7CiAgICAgICAgLy8gamlrYSBzdWRhaCBtZW1iYWNhIHNhdHUgYmFyaXMgcGVudWgsIHRldGFwIGt1bXB1bGthbiBzZWx1cnVoIGlucHV0ICh0b2xlcmFuKQogICAgfQoKICAgIC8vIGdhbnRpIGtvbWEgZGVuZ2FuIHNwYXNpIHVudHVrIG1lbXVkYWhrYW4gcGFyc2luZwogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJsZW4oYnVmKTsgKytpKSB7CiAgICAgICAgaWYgKGJ1ZltpXSA9PSAnLCcpIGJ1ZltpXSA9ICcgJzsKICAgIH0KCiAgICAvLyB0b2tlbmlzYXNpIGRhbiBrb252ZXJzaSBzZW11YSBpbnRlZ2VyIHlhbmcgYWRhCiAgICBpbnQgbnVtc1sxMDAwXTsKICAgIGludCBjbnQgPSAwOwogICAgY2hhciAqdG9rID0gc3RydG9rKGJ1ZiwgIiBcdFxyXG4iKTsKICAgIHdoaWxlICh0b2spIHsKICAgICAgICBjaGFyICplbmRwdHI7CiAgICAgICAgbG9uZyB2YWwgPSBzdHJ0b2wodG9rLCAmZW5kcHRyLCAxMCk7CiAgICAgICAgaWYgKGVuZHB0ciAhPSB0b2spIHsKICAgICAgICAgICAgbnVtc1tjbnQrK10gPSAoaW50KXZhbDsKICAgICAgICB9CiAgICAgICAgdG9rID0gc3RydG9rKE5VTEwsICIgXHRcclxuIik7CiAgICB9CgogICAgaWYgKGNudCA8IDEpIHJldHVybiAwOwoKICAgIGludCBpZHggPSAwOwogICAgaW50IG4gPSBudW1zW2lkeCsrXTsgICAgICAgICAgICAgICAgICAgICAvLyBqdW1sYWggaXRlbQogICAgaWYgKGNudCA8IDEgKyAyKm4gKyAxKSB7CiAgICAgICAgLy8gaW5wdXQgdGlkYWsgbGVuZ2thcAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGludCAqdyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSAqIG4pOwogICAgaW50ICp2ID0gKGludCopbWFsbG9jKHNpemVvZihpbnQpICogbik7CiAgICBpZiAoIXcgfHwgIXYpIHJldHVybiAwOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB3W2ldID0gbnVtc1tpZHgrK107CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgdltpXSA9IG51bXNbaWR4KytdOwogICAgaW50IGNhcCA9IG51bXNbaWR4KytdOwoKICAgIGlmIChjYXAgPCAwKSBjYXAgPSAwOwoKICAgIC8vIERQIDAtMSBrbmFwc2FjayAobWVtYWtzaW1hbGthbiBuaWxhaSkKICAgIC8vIGd1bmFrYW4gYXJyYXkgMUQgdW50dWsgZWZpc2llbnNpOiBkcFtqXSA9IG1ha3NpbXVtIG5pbGFpIHVudHVrIGthcGFzaXRhcyBqCiAgICBpbnQgKmRwID0gKGludCopY2FsbG9jKGNhcCArIDEsIHNpemVvZihpbnQpKTsKICAgIGlmICghZHApIHsKICAgICAgICBmcmVlKHcpOyBmcmVlKHYpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaW50IHdpID0gd1tpXTsKICAgICAgICBpbnQgdmkgPSB2W2ldOwogICAgICAgIC8vIGl0ZXJhc2kgbXVuZHVyIGFnYXIgMC0xIGtuYXBzYWNrIGJlbmFyCiAgICAgICAgZm9yIChpbnQgaiA9IGNhcDsgaiA+PSB3aTsgLS1qKSB7CiAgICAgICAgICAgIGludCBjYW5kID0gZHBbaiAtIHdpXSArIHZpOwogICAgICAgICAgICBpZiAoY2FuZCA+IGRwW2pdKSBkcFtqXSA9IGNhbmQ7CiAgICAgICAgfQogICAgfQoKICAgIC8vIGhhc2lsIG9wdGltYWwgPSBkcFtjYXBdCiAgICBwcmludGYoIiVkIiwgZHBbY2FwXSk7CgogICAgZnJlZSh3KTsgZnJlZSh2KTsgZnJlZShkcCk7CiAgICByZXR1cm4gMDsKfQo=