最少硬币问题 动态规划

原创 2016年05月30日 20:42:12

问题描述

需要找零x元,有n种面值硬币,求找零最少需要硬币个数的方法。

问题分析

这题如果用贪心算法做,很可能无法得到最优解甚至无法无法找零,比如要找零11元,有{5,6,10}三种硬币,最优解是{5,6},用贪心就会先用10块钱去消耗,那这题就无法完成。

所以这题用动态规划最合适,利用递推和缓存,动态规划将问题拆分成若干个子问题,通过子问题的最优解不断往上递推得出问题的最优解,这比贪心算法慢,但得到的答案跟准确。

代码

#include<stdio.h>
void minCoin(int cost, int coinType[], int typeNum);
void main()
{
    int cost = 18;  //找零面值
    int  coinType[5] = { 1,2,5,9,10 }; //纸币面额
//  int coinType[2] = { 3,4 }; //TEST
    const int  typeNum = sizeof(coinType) / sizeof(coinType[1]);//种类数量
                                                                //int  coinUsed[typeNum + 1]; coinUsed[0] = 0;// 1-cost 找零各需要多少硬币 

    minCoin(cost, coinType, typeNum);
}

void minCoin(int cost, int coinType[], int typeNum)
{

    int *coinUsed = new int[typeNum + 1];   coinUsed[0] = 0;// 1-cost 找零各需要多少硬币 
    int *addHistroy = new int[typeNum + 1];  addHistroy[0] = 0;  //记录每次增加的硬币

    for (int i = 1; i <= cost; i++)   //从1块钱开始计数
    {
        coinUsed[i] = 9999999;    //当9999999时表示无法找零

        for (int t = 0; t < typeNum; t++)
        {

            if (i >= coinType[t])
            {

                if (coinUsed[i - coinType[t]] + 1 <= coinUsed[i])
                {
                    coinUsed[i] = coinUsed[i - coinType[t]] + 1;
                    addHistroy[i] = coinType[t];
                }
            }
        }

        /*  coinUsed[i]==9999999?  printf("无法找零\n") : printf("找%d块钱最少需要%d个硬币\n",i,  coinUsed[i]); 测试*/

    }
    if (coinUsed[cost] != 9999999)
    {
        printf("找%d块钱最少需要%d个硬币 如下:\n", cost, coinUsed[cost]);
        while (cost > 0)
        {
            printf("%d ", addHistroy[cost]);
            cost = cost - addHistroy[cost];
        }
    }
    else
    {
        printf("无法找%d块钱\n",cost);
    }

}

这里写图片描述

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

动态规划——最少硬币问题

之前我在动态规划(dynamic programming)原理抛出了一个最少硬币问题。接下来,在这篇文章,我们将会对硬币问题进行一个全面的解析,并尽可能的解释动态规划的原理,希望读者们可以通过这个问题...

最少硬币问题(动态规划解决)

设有n中不同面值的硬币,各硬币的面值存在于数组T[1..n]中,可以使用的面值硬币个数不限。假如现在找的钱是j,1 解决方法: 另c[i,j]代表用前中硬币兑换j所用的最少数目。#include ...

最少硬币找零问题-动态规划

动态规划把问题分为子为题

最少硬币问题(多重背包问题)

最少硬币问题 问题描述:设有n种不同面值的硬币,各硬币的面值存在于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0£m£2...

动态规划——最少硬币问题

http://hawstein.com/posts/dp-knapsack.html 如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但...

动态规划——最少硬币问题

如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?  (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出解,比如1元换成2元的时候) 首先我们思考一个问题,如何用...
  • hushhw
  • hushhw
  • 2017年08月23日 22:35
  • 182

动态规划:最少硬币找零问题、01背包问题、完全背包问题

动态规划把问题分为子为题,解决了这些子问题,再把子问题合并起来,便可以得到问题的解。在解决子问题过程中,需要把子问题的解保存起来方便后面使用。 最少硬币找零问题为:给予不同面值的硬币若干种种(每种硬...

最少硬币找零问题-动态规划

动态规划把问题分为子为题,解决了这些子问题,再把子问题合并起来,便可以得到问题的解。在解决子问题过程中,需要把子问题的解保存起来方便后面使用。 最少硬币找零问题为:给予不同面值的硬币若干种种(每...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

动态规划入门之硬币问题

动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最少硬币问题 动态规划
举报原因:
原因补充:

(最多只允许输入30个字)