Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <set>
- #include <algorithm>
- #include <vector>
- #include <limits.h>
- using namespace std;
- const int inf = INT_MAX;
- int main() {
- int n = 0, w, k;
- cin >> w;
- vector<int> m;
- vector<int> c;
- while (cin >> k) {
- m.push_back(k);
- ++n;
- }
- while (cin >> k) {
- c.push_back(k);
- }
- n = c.size();
- vector<vector<int>> dp(n + 1, vector<int>(w + 1, inf));
- vector<vector<int>> p(n + 1, vector<int>(w + 1, -1));
- for (int i = 0; i <= w; ++i) {
- dp[0][i] = 0;
- }
- for (int i = 1; i <= n; ++i) {
- for (int j = 0; j <= w; ++j) {
- dp[i][j] = dp[i - 1][j];
- if (j - m[i - 1] >= 0 && dp[i - 1][j - m[i - 1]] != inf && dp[i - 1][j - m[i - 1]] + c[i - 1] > dp[i - 1][j]) {
- dp[i][j] = dp[i - 1][j - m[i - 1]] + c[i - 1];
- p[i][j] = i;
- }
- }
- }
- vector<int> res;
- for (int i = n; i >= 0; --i) {
- if (w >= 0 && p[i][w] > 0) {
- res.push_back(p[i][w]);
- w -= m[i - 1];
- }
- }
- reverse(begin(res), end(res));
- for (int i : res)
- cout << i << endl;
- }
Add Comment
Please, Sign In to add comment