Skip to content

Instantly share code, notes, and snippets.

@WizzyGeek
Created February 22, 2024 15:50
Show Gist options
  • Save WizzyGeek/0c2257d7ddfbfedfe831f481caf7d5e2 to your computer and use it in GitHub Desktop.
Save WizzyGeek/0c2257d7ddfbfedfe831f481caf7d5e2 to your computer and use it in GitHub Desktop.
Boolean Knapsack problem - but it is in simple somewhat modern juicy c++
#include<iostream>
#include<vector>
int main() {
int cap, n;
std::cin >> cap >> n;
std::vector<int> w(n, 0), c(n, 0);
for (int &i : w) std::cin >> i;
for (int &i : c) std::cin >> i;
// make w, c 1-indexed
w.insert(w.begin(), 0);
c.insert(c.begin(), 0);
std::vector<std::vector<int>> dp(n + 1, std::vector<int>(cap + 1, 0));
int temp;
for (int i = 1; i <= n; i++) {
int wi = w[i], ci = c[i];
std::vector<int> &dpi = dp[i], &dpl = dp[i - 1];
for (int wg = 0; wg <= cap; wg++) {
dpi[wg] = dpl[wg];
if (wg >= wi && (temp = dpl[wg - wi] + ci) > dpi[wg]) dpi[wg] = temp;
}
}
std::cout << dp[n][cap] << '\n';
int rweight = cap;
std::vector<bool> v(n + 1, false);
for (int i = n; i >= 1 && rweight > 0; i--) {
if (dp[i][rweight] > dp[i - 1][rweight]) {
v[i] = true;
rweight -= w[i];
}
}
for (int i = 1; i <= n; i++) std::cout << (v[i] ? '1' : '0');
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment