1. 程式人生 > >分數背包(貪心策略)

分數背包(貪心策略)

i++ AI 裝載 問題 for amount ios vector 如何

  問題描述:體積分別為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

  

分數背包(貪心策略)