以下是一个使用贪心算法实现的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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录