#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Item {
public:
string name;
int value;
int weight;
Item(string n, int v, int w) {
name = n;
value = v;
weight = w;
}
};
vector<Item> stealObject(int packCapacity, vector<Item>& items) {
int rowCount = items.size() + 1;
int colCount = packCapacity + 1;
vector<vector<int>> dpArray(rowCount, vector<int>(colCount, 0));
vector<Item> objectStolen;
for (int i = 0; i < rowCount; ++i) {
fill(dpArray[i].begin(), dpArray[i].end(), 0);
}
for (int i = 1; i < rowCount; ++i) {
for (int j = 1; j < colCount; ++j) {
if (items[i - 1].weight <= j) {
dpArray[i][j] = max(items[i - 1].value + dpArray[i - 1][j - items[i - 1].weight], dpArray[i - 1][j]);
}
else {
dpArray[i][j] = dpArray[i - 1][j];
}
}
}
int i = rowCount - 1;
int j = colCount - 1;
while (i > 0 && j > 0) {
if (dpArray[i][j] != dpArray[i - 1][j]) {
objectStolen.push_back(items[i - 1]);
j = j - items[i - 1].weight;
i = i - 1;
}
else {
i = i - 1;
}
}
return objectStolen;
}
void test() {
vector<Item> items = {
Item("故宫", 7, 1),
Item("颐和园", 8, 2),
Item("长城", 9, 3),
Item("天坛", 6, 1)
};
vector<Item> objectInPack = stealObject(4, items);
int maxValue = 0;
cout << "途径以下景点:" << endl;
for (const Item& item : objectInPack) {
maxValue += item.value;
cout << item.name << endl;
}
cout << "总评分:" << maxValue << endl;
}
int main() {
test();
return 0;
}