贪心:背包问题(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