C++ 贪心算法:快递装载问题

题目描述

有一批快递要装上一辆载重量为 c 的快递车进行运送。第 i 个快递的重量为 Wi。由于每件快递都很小,几乎不占快递车的空间,但是都比较重。为了节省成本,因此需要考虑在装载体积不受限制的情况下,将尽可能多的快递装上快递车,请你编程帮助快递小哥求出来最多能装载多少件快递。

输入描述

第一行共两个整数 N,c,表示快递的件数和快递车的载重量。

第二行共有 N 个整数,分别表示快递的重量 Wi。

输出描述

共一行,输出 1 个整数,表示最多能装载的快递件数。

样例1

输入 8 400 100 200 50 90 150 50 20 80

输出 6

提示

对于 100% 的数据,N≤100,c≤10000。

代码示例

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int N, c;
    cin >> N >> c;
    int w[N];
    for (int i = 0; i < N; i++) {
        cin >> w[i];
    }
    // 将快递按照重量从小到大排序
    sort(w, w + N);
    int count = 0;
    int sum = 0;
    // 从最轻的快递开始依次装载
    for (int i = 0; i < N; i++) {
        if (sum + w[i] <= c) {
            sum += w[i];
            count++;
        } else {
            break;
        }
    }
    cout << count << endl;
    return 0;
}

思路

首先将快递按照重量从小到大排序。 然后从最轻的快递开始依次装载,直到快递车的载重量达到上限或者所有快递装载完毕。

具体步骤如下:

  1. 输入 N 和 c。
  2. 输入快递的重量,并将其存储在一个数组中。
  3. 将数组按照升序排序。
  4. 使用一个变量 count 记录已经装载的快递件数,初始值为 0。
  5. 使用一个变量 sum 记录已经装载的快递的总重量,初始值为 0。
  6. 从数组的第一个元素开始遍历:
    • 如果当前快递的重量加上 sum 小于等于 c,则将当前快递装载到快递车上,更新 sum 和 count。
    • 否则,跳出循环。
  7. 输出 count,即最多能装载的快递件数。

时间复杂度分析

排序的时间复杂度为 O(NlogN),遍历数组的时间复杂度为 O(N)。 所以总的时间复杂度为 O(NlogN)。

空间复杂度分析

除了输入和输出的空间,额外使用的空间为快递重量数组,空间复杂度为 O(N)。


原文地址: https://www.cveoy.top/t/topic/pNjt 著作权归作者所有。请勿转载和采集!

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