#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> knapsack(int W, int n, vector<int>& w, vector<int>& v) {
vector<long long> dp(W + 1, 0);
for (int i = 0; i < n; ++i) {
for (int j = w[i]; j <= W; ++j) {
dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
}
}
int max_value = dp[W];
vector<int> solution;
int remaining_weight = W;
for (int i = n - 1; i >= 0; --i) {
while (remaining_weight >= w[i] && dp[remaining_weight] == dp[remaining_weight - w[i]] + v[i]) {
solution.push_back(i + 1);
remaining_weight -= w[i];
}
}
cout << "最优解:" << endl;
cout << "总价值=" << max_value << ";" << endl;
cout << "方案:";
for (int i = solution.size() - 1; i >= 0; --i) {
int count = 1;
if (i < solution.size() - 1) {
while (i > 0 && solution[i] == solution[i - 1]) {
--i;
++count;
}
}
cout << "物品" << solution[i] << "共" << count << "件,";
}
cout << endl;
return solution;
}
int main() {
int W = 7;
int n = 3;
vector<int> w = {3, 4, 2};
vector<int> v = {4, 5, 3};
vector<int> result = knapsack(W, n, w, v);
return 0;
}