貪心:背包問題(C++)


題目:有一個背包,背包容量是M=150。有7個物品,物品可以分割成任意大小。

要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。

物品 A  B  C  D  E  F  G

重量 35  30  60  50  40  10  25

價值 10  40  30  50  35  40  30

 

思想:裝性價比最高的物品。

 

#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>

using namespace std;

bool compare(tuple<int, int, double> t1, tuple<int, int, double> t2) {
    return get<2>(t1) > get<2>(t2);
}

int main()
{
    int n = 0, W = 0, w = 0, v = 0;
    cin >> n >> W;//總數量和最大重量
    vector<tuple<int, int, double> > vec(n);
    vector<tuple<int, int>> vt;
    for (int i = 0; i < n; ++i) {
        cin >> w >> v;//重量和價值
        vec[i] = { w, v , (double)v / (double)w };
    }
    sort(vec.begin(), vec.end(), compare);//權值排序
    cout << endl;
    double sum = 0.0;
    for (auto& i : vec) {
        if (W - get<0>(i) >= 0) {//先整塊選擇
            W = W - get<0>(i);
            sum += get<1>(i);
            cout << "重量:" << get<0>(i) << " 價值:" << get<1>(i) << "放了1個" << endl;
        }
        else if(W - get<0>(i) < 0 && W > 0){
            //划分選擇
            double k = (double)W / (double)get<0>(i);
            sum += get<1>(i) * k;
            cout << "重量:" << get<0>(i) << " 價值:" << get<1>(i) <<  "放置比例:" << k << endl;
            break;
        }
    }
    cout << endl;
    cout << "總價值:" << sum << endl;

    system("PAUSE");
    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM