C++贪心算法实现并详细介绍各段代码的功能阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 NN le 100NN≤100 堆金币第 ii 堆金币的总重量和总价值分别是 m_iv_i1le m_iv_i le 100m i v i 1≤m i v i ≤100。阿里巴巴有一个承重量为 TT le 1000TT≤1000 的背包但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都
以下是一个使用贪心算法实现的C++代码,用于解决阿里巴巴在藏宝洞中装走最多价值金币的问题。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义金币结构体
struct Coin {
int weight;
int value;
};
// 贪心算法实现函数
int getMaxValue(vector<Coin>& coins, int capacity) {
// 按照单位价格从高到低排序
sort(coins.begin(), coins.end(), [](const Coin& a, const Coin& b) {
return a.value / a.weight > b.value / b.weight;
});
int maxValue = 0;
// 依次选择单位价格最高的金币
for (int i = 0; i < coins.size(); i++) {
if (capacity >= coins[i].weight) {
maxValue += coins[i].value;
capacity -= coins[i].weight;
} else {
maxValue += capacity * (coins[i].value / coins[i].weight);
break;
}
}
return maxValue;
}
int main() {
int N, T;
cin >> N >> T;
vector<Coin> coins(N);
for (int i = 0; i < N; i++) {
cin >> coins[i].weight >> coins[i].value;
}
int maxValue = getMaxValue(coins, T);
cout << maxValue << endl;
return 0;
}
代码功能分段解释如下:
- 第1行到第7行是引用的头文件和使用的命名空间。
- 第10行定义了一个结构体
Coin,用于表示金币的重量和价值。 - 第13行定义了一个
getMaxValue函数,用于实现贪心算法求解最大价值。 - 第15行到第19行使用
sort函数对金币按照单位价格从高到低进行排序。这里使用了lambda表达式作为排序的比较函数。 - 第23行初始化最大价值为0。
- 第26行到第35行使用贪心策略依次选择单位价格最高的金币进行装包。如果当前金币的重量小于等于剩余背包的承重量,将该金币的价值加到最大价值上,并更新剩余背包的承重量;否则,将剩余背包的承重量全部用于装分割后的金币,并跳出循环。
- 第38行返回最大价值。
- 第41行到第45行是主函数
main。首先读入金币的堆数和背包的承重量。然后使用一个循环读入每堆金币的重量和价值。最后调用getMaxValue函数求解最大价值,并输出结果。
这段代码使用贪心算法,按照单位价格从高到低排序金币,然后依次选择单位价格最高的金币进行装包。通过这种贪心策略,可以保证每次选择的金币单位价格最高,从而使得最后装包的金币总价值最大
原文地址: https://www.cveoy.top/t/topic/h2qk 著作权归作者所有。请勿转载和采集!