#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct Item {
int weight;
int value;
};
bool cmp(Item a, Item b) {
return (double(a.value) / a.weight) > (double(b.value) / b.weight);
}
double fractionalKnapsack(int capacity, vector<Item>& items, int idx,
double valueSoFar) {
if (capacity == 0 || idx == items.size()) {
return valueSoFar;
}
if (items[idx].weight <= capacity) {
valueSoFar += items[idx].value;
capacity -= items[idx].weight;
} else {
double fraction = double(capacity) / items[idx].weight;
valueSoFar += items[idx].value * fraction;
capacity = 0;
}
return fractionalKnapsack(capacity, items, idx + 1, valueSoFar);
}
double branchAndBoundKnapsack(int capacity, vector<Item>& items) {
sort(items.begin(), items.end(), cmp);
double valueSoFar = 0;
int idx = 0;
return fractionalKnapsack(capacity, items, idx, valueSoFar);
}
int main() {
vector<Item> items = {{10, 60}, {20, 100}, {30, 120}};
int capacity = 50;
double maxValue = branchAndBoundKnapsack(capacity, items);
cout << "背包能够装下的最大价值为:" << maxValue << endl;
return 0;
}