#include <bits/stdc++.h>

using namespace std;

struct Lingshi {
    string mingcheng;
    int zhongliang;    // 重量(kg)
    int meiwiezhi;     // 美味值
    double danweimeiwei;  // 单位美味值 = 美味值/重量
};

// 比较函数:按单位美味值从大到小排序
bool bijiao(Lingshi a, Lingshi b) {
    return a.danweimeiwei > b.danweimeiwei; // 降序排列
}

// 贪心背包算法
double tanxinbeibao(int rongliang, vector<Lingshi>& lingshis) {
    // 1. 计算每种零食的单位美味值
    for (int i = 0; i < lingshis.size(); i++) {
        lingshis[i].danweimeiwei = (double)lingshis[i].meiwiezhi / lingshis[i].zhongliang;
    }
    
    // 2. 按单位美味值排序(最美味在前)
    sort(lingshis.begin(), lingshis.end(), bijiao);
    
    double zongmeiwei = 0.0;  // 总美味值
    int dangqianzhong = 0;    // 当前背包重量
    
    // 3. 遍历排序后的零食列表
    for (int i = 0; i < lingshis.size(); i++) {
        // 如果零食能完整放入背包
        if (dangqianzhong + lingshis[i].zhongliang <= rongliang) {
            dangqianzhong += lingshis[i].zhongliang;
            zongmeiwei += lingshis[i].meiwiezhi;
            cout << "装入 " << lingshis[i].mingcheng << "(整包)" << endl;
        } 
        // 如果只能装一部分(分数背包特性)
        else if (dangqianzhong < rongliang) {
            int shengyu = rongliang - dangqianzhong; // 剩余空间
            double fen = (double)shengyu / lingshis[i].zhongliang;
            zongmeiwei += lingshis[i].meiwiezhi * fen;
            cout << "装入 " << lingshis[i].mingcheng << " 的 " << fen*100 << "%" << endl;
            break; // 背包已满
        }
    }
    return zongmeiwei;
}

int main() {
    // 背包容量
    int rongliang = 7;
    
    // 初始化零食列表
    vector<Lingshi> lingshis = {
        {"薯片", 1, 10, 0},
        {"糖果", 2, 15, 0},
        {"巧克力", 3, 20, 0},
        {"饼干", 4, 25, 0}
    };
    
    // 调用贪心算法
    double zuidameiwei = tanxinbeibao(rongliang, lingshis);
    cout << "总美味值 = " << zuidameiwei << endl;
    
    return 0;
}

0 条评论

目前还没有评论...