问题描述:体积分别为10cm3, 50cm3, 80cm3的盒子中装有价值分别为60k, 200k, 240k的珠宝,其中盒子的单位体积为10cm3,也就是说体积为50cm3的盒子中装有5个10cm3的小盒子,80cm3的盒子中装有8个10cm3的小盒子。还有一个最多能装100cm3的箱子,请问如何装载装有珠宝的盒子可使得箱子中的珠宝价值最大?
利用贪心,则很简单:
#include <iostream> #include <vector> using namespace std; class greedyAlgorithm { public: int fractionalKnapsack(vector<int> v, vector<int> w, int size) { int value = 0; int amount = 0; for (int i = 0; i < v.size(); i++) { if (amount > size) break; if (size - amount <= w[i]) value += v[i] * (size - amount) / w[i]; else value += v[i]; amount += w[i]; } return value; } }; int main() { vector<int> v{60, 200, 240}; vector<int> w{10, 50, 80}; greedyAlgorithm solve; cout << solve.fractionalKnapsack(v, w, 100); return 0; }
运行结果:
380