分发饼干问题——用贪心算法解决

发布于:2025-04-16 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一:问题描述

二:解决思路

贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客

 三:代码实现

四:复杂度分析


一:问题描述

分发饼干问题是一个经典的可以使用贪心算法解决的问题,问题描述如下:

有一群孩子和一堆饼干,每个孩子都有一个胃口值 g[i](表示该孩子需要的饼干的最小尺寸才能满足),每个饼干都有一个尺寸 s[j]。目标是尽可能让更多的孩子得到满足,即找到能满足的孩子的最大数量。也就是说,要将饼干分配给孩子,当且仅当饼干的尺寸大于或等于孩子的胃口值时,这个孩子才能被满足。(每个孩子最多一块饼干)

二:解决思路

贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客

贪心策略是优先满足胃口值小的孩子。因为对于胃口值小的孩子,更容易找到合适尺寸的饼干来满足他,这样可以尽量让更多的孩子得到满足。具体步骤如下:

  1. 对孩子的胃口值数组 g 和饼干尺寸数组 s 分别进行排序(升序)。
  2. 用两个指针分别遍历孩子数组和饼干数组。
  3. 从胃口值最小的孩子开始,尝试用最小尺寸的饼干去满足他。如果当前饼干的尺寸大于或等于当前孩子的胃口值,那么这个孩子就被满足,两个指针都向后移动一位;如果当前饼干的尺寸小于当前孩子的胃口值,说明这个饼干不能满足这个孩子,只能尝试下一个更大尺寸的饼干,即只移动饼干数组的指针。
  4. 重复步骤 3,直到遍历完所有孩子或者所有饼干。

 三:代码实现

#include <stdio.h>
#include <stdlib.h>

// 比较函数,用于 qsort 排序
int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

// 解决分发饼干问题的函数
int findContentChildren(int* g, int gSize, int* s, int sSize) {
    // 对孩子的胃口值数组和饼干尺寸数组进行排序
    qsort(g, gSize, sizeof(int), compare);
    qsort(s, sSize, sizeof(int), compare);

    int child_index = 0;
    int cookie_index = 0;
    // 遍历孩子和饼干数组
    while (child_index < gSize && cookie_index < sSize) {
        if (s[cookie_index] >= g[child_index]) {
            // 当前饼干能满足当前孩子,孩子和饼干指针都后移
            child_index++;
            cookie_index++;
        } else {
            // 当前饼干不能满足当前孩子,只移动饼干指针
            cookie_index++;
        }
    }
    return child_index;
}

int main() {
    int g[] = {1, 2, 3};
    int s[] = {1, 1};
    int gSize = sizeof(g) / sizeof(g[0]);
    int sSize = sizeof(s) / sizeof(s[0]);
    int result = findContentChildren(g, gSize, s, sSize);
    printf("能满足的孩子数量是: %d\n", result);
    return 0;
}
    

四:复杂度分析

  • 时间复杂度:排序操作的时间复杂度为 (O(n log n + m log m)),其中 n 是孩子的数量,m 是饼干的数量。遍历数组的时间复杂度为 (O(min(n, m)))。所以总的时间复杂度为 (O(n log n + m log m))
  • 空间复杂度qsort 函数通常需要 (O(log n + log m)) 的额外空间,因此总的空间复杂度为 (O(log n + log m))