#include <iostream>
using namespace std;
struct Item {
string name;
int day;
int score;
Item *next;
Item(string n, int w, int v) {
name = n;
day = w;
score = v;
next = NULL;
}
Item() {
name = "";
day = 0;
score = 0;
next = NULL;
}
Item(Item *item) {
name = item->name;
day = item->day;
score = item->score;
next = item->next;
}
};
struct Result {
int score;
Item *head;
Result() {
score = 0;
head = new Item();
}
Result(Result *result) {
score = result->score;
head = new Item();
head->next = result->head->next;
}
};
Result* backpack(int packCapacity, Item *items, int itemCount) {
int minday = items[0].day;
for (int i = 1; i < itemCount; ++i)
{
int curday = items[i].day;
if (curday < minday) {
minday = curday;
}
}
if (packCapacity < minday) {
cout << "The capacity of package "
<< packCapacity << " is less than the minimum day of items "
<< minday << endl;
return NULL;
}
Result** dpArray = new Result*[itemCount]();
int dayCount = packCapacity + 1;
for (int i = 0; i < itemCount; ++i) {
dpArray[i] = new Result[dayCount]();
}
for (int i = 0; i < itemCount; ++i)
{
int curday = items[i].day;
int curscore = items[i].score;
for (int w = minday; w < dayCount; ++w)
{
int preTotalscore= 0;
if (i > 0) {
preTotalscore = dpArray[i - 1][w].score;
}
int curTotalscore = 0;
if (w >= curday) {
curTotalscore = curscore;
}
if ( w > curday && i > 0 ) {
curTotalscore += dpArray[i-1][w - curday].score;
dpArray[i][w].head->next = dpArray[i-1][w - curday].head->next;
}
int maxTotalscore = preTotalscore;
if (maxTotalscore < curTotalscore) {
maxTotalscore = curTotalscore;
items[i].next = dpArray[i][w].head->next;
dpArray[i][w].head->next = new Item(&items[i]);
}
else {
dpArray[i][w].head->next = dpArray[i - 1][w].head->next;
}
dpArray[i][w].score = maxTotalscore;
}
}
Result *result = new Result(&dpArray[itemCount - 1][dayCount - 1]);
for (int i = 0; i < itemCount; ++i) {
for (int j = 0; j < dayCount; ++j) {
delete dpArray[i][j].head;
}
delete [] dpArray[i];
}
delete [] dpArray;
return result;
}
int main() {
int packCapacity = 4;
Item items[] = {
Item("故宫", 1, 7),
Item("颐和园", 2, 8),
Item("长城", 3, 9),
Item("天坛", 1, 6)
};
int itemCount = sizeof(items)/sizeof(Item);
Result* result = NULL;
result = backpack(packCapacity, items, itemCount);
if (result->score > 0) {
cout << "最大价值是:" << result->score << endl;
Item *item = result->head->next;
Item * prev = NULL;
cout << "能获得最大价值的景点有:";
while ( item != NULL) {
cout << item->name << ", ";
prev = item;
item = item->next;
delete prev;
}
cout << endl;
}
delete result->head;
delete result;
}