【刷题之路】零钱凑整问题

原创 2016年06月06日 16:34:34

有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。

经典的动态规划问题,首先需要确定状态,然后叠加即可。

首先确定初始状态,当目标钱数为0时,无论如何只有一种方法,即不用任何面值的钱

当目标钱数小于面额最小的钱时,方法数为零

定义一个二维数组,i为所使用的面额index, j为目标钱数,我们需要按行来填满这个数组,数组的最后一个元素即为所求。

假设penny中共有,1,2,5三种面额钱数,需要凑齐100块

res[0][0]  即为使用1块钱,来凑齐0元,则只有一种方法,res[0][0]=1,res[0][1]同理也等于一,直到100,

res[1][0] 即为使用2块钱来凑0元,则只有一种方法,不难看出,res[i][0]=1。这样。我们就定义好了初始状态,第一行全为1,第一列全为1

当求res[2][6]时,很显然包括两部分,首先,不使用当前的面额,只使用上一种面额,则为res[1][6],第二部分,当需要求使用当前面额时,问题就变成了用一张5块以及若干1块2块来达到目标金额的方法也就是res[2][1]所以res[2][6]=res[1][6]+res[2][1]

总结上述规则可知,res[i][j]也就等于res[i-1][j]+res[i][j-penny[i]](此处需要说明一下为什么只减去1次当前面额:有人会疑问如果我想用两张当前面额呢?其实减去当前面额后,如果目标值仍大于当前面额,则所加上的res[i][j-penny[i]]在计算的时候,一定是res[i-1][j-penny[i]]+res[i][j-penny[i]-penny[i]]计算出来的,也就是说之前的已经包含了使用一张当前面额的情况,加上本次又一次使用当前面额,即使用两张当前面额的情况,实际上已经算过了)

这样得到了递推公式,程序如下

class Exchange {
public:
    int countWays(vector<int> penny, int n, int aim) {
        // write code here
        vector<int> sub(aim+1);
        vector<vector<int>> res(n,sub);
        int i,j;
        for(i=0;i<=aim;i++){
            if(i%penny[0]==0) res[0][i]=1;
        }
        for(i=1;i<n;i++){
            res[i][0]=1;
            for(j=1;j<=aim;j++){
                if(j-penny[i]>=0) res[i][j]=res[i-1][j]+res[i][j-penny[i]]; //注意此处需要判断,如果减去小于0的话,显然不能用当前面额的纸币
                else res[i][j]=res[i-1][j];
            }
        }
        return res[n-1][aim];
        
    }
};

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

相关文章推荐

Delphi7高级应用开发随书源码

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

零钱组合

给定面值为1,5,10,20,50的零钱,给定一个金额A,求组合成A的方法的数量 假定一个面额为x,则组合为A的方法数目 = 不使用x面额的零钱组合成A的方法的数量 + 使用任何面值的零钱组合成A ...

每日一题之动归-换钱的最少次数(一)

题目: 给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。 举个例子 ...

换钱的最少货币数

1.给定数组arr,arr中所有的值都是正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。 方法一: 第一列都为0...

零钱换整问题

小明去银行存钱,拿了一堆硬币。已知1角的硬币厚度为1.8mm ,5 角的硬币厚1.5mm ,1元的硬币为2.0mm 。小明将1 角的硬币放成一摞,将5 角的硬币硬币放成一摞,将1元的硬币放成一摞,发现...

【刷题之路】背包问题

一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最...

c语言求硬币找零钱问题

  • 2009年09月13日 23:28
  • 676B
  • 下载

最少零钱问题,最少硬币问题

  • 2010年05月06日 23:23
  • 708B
  • 下载

动态规划系列(2)——找零钱问题

用动态规划算法来实现找零钱问题的求解。
  • dnxbjyj
  • dnxbjyj
  • 2017年04月18日 01:09
  • 414

动态规划1:找零钱练问题

动态规划1:找零钱练问题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【刷题之路】零钱凑整问题
举报原因:
原因补充:

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