Created
February 22, 2024 15:50
-
-
Save WizzyGeek/0c2257d7ddfbfedfe831f481caf7d5e2 to your computer and use it in GitHub Desktop.
Boolean Knapsack problem - but it is in simple somewhat modern juicy c++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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