- 吐吐很快乐
有毒代码
- 2025-7-16 15:16:28 @
#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 条评论
目前还没有评论...