📜  硬币找零的C程序| DP-7(1)

📅  最后修改于: 2023-12-03 15:11:24.035000             🧑  作者: Mango

硬币找零的C程序| DP-7

这是一个使用动态规划算法来解决硬币找零问题的C语言程序。硬币找零问题是计算机科学中经典的问题之一,在货币中使用最多的硬币组合方式,以使总面值等于要找的零钱。

问题描述

假设有一堆无限多的硬币,其中包括面值为d1、d2、...、dn的硬币,现要用最少的硬币凑出总面值为V的钱,求所需要的最少硬币数。

例如,可以假设有三种硬币:1元、3元和5元,需要找零11元。最少的硬币数组合方式是3个5元、2个3元和1个1元,需要6个硬币。

动态规划解法

动态规划可以解决复杂的、有很多重叠子问题的问题,同时也可以减少重复计算的次数,从而提高算法效率。

在硬币找零问题中,采用动态规划算法需要进行以下步骤:

  1. 初始化:设f[i]表示凑出面值i所需要的最少硬币数。

  2. 状态转移方程:对于每一个硬币j,有f[i]=min{f[i-dj]+1},其中dj表示面值为j的硬币。

  3. 边界条件:f[0]=0,即当需要凑的面值为0时,不需要任何硬币。

C语言实现

下面是C语言实现硬币找零问题的代码,通过输入硬币面值和需要找零的金额,输出所需最少硬币数。

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

int minCoins(int coins[], int m, int V)
{
    int f[V+1];
    f[0] = 0;

    for (int i=1; i<=V; i++)
        f[i] = INT_MAX;

    for (int i=1; i<=V; i++)
    {
        for (int j=0; j<m; j++)
        {
            if (coins[j] <= i)
            {
                int sub_res = f[i-coins[j]];
                if (sub_res != INT_MAX && sub_res + 1 < f[i])
                    f[i] = sub_res + 1;
            }
        }
    }

    return f[V];
}

int main()
{
    int coins[] = {1, 3, 5};
    int m = sizeof(coins)/sizeof(coins[0]);

    int V = 11;
    int result = minCoins(coins, m, V);

    printf("Minimum coins required to make %d is %d\n", V, result);

    return 0;
}

在上面的代码中,minCoins函数采用了动态规划算法,通过循环硬币面值和需要凑的面值找到所需最少硬币数量。在main函数中,打印了需要凑的面值为11元的情况下所需最少硬币数。