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

原创 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];
        
    }
};

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

换零钱--动态规划

题目示例: 【题目】 给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。...
  • u010889616
  • u010889616
  • 2015年12月03日 21:27
  • 921

深入解析之将100元兑换为1元、5元、10元的零钱,请问有多少种兑换方法

要将100元兑换为1元、5元、10元的零钱,请问有多少种兑换方法?这道算法题不知不觉走进了我的世界,引起了我极大的兴趣。现在就将我对它的研究分享出来,供大家点评。        看到这个题目的第一感...
  • marshal2004
  • marshal2004
  • 2015年07月27日 20:42
  • 2655

【动态规划】—找零钱问题

算法描述: 有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法...
  • u012404928
  • u012404928
  • 2017年04月08日 22:42
  • 302

零钱换整问题

小明去银行存钱,拿了一堆硬币。已知1角的硬币厚度为1.8mm ,5 角的硬币厚1.5mm ,1元的硬币为2.0mm 。小明将1 角的硬币放成一摞,将5 角的硬币硬币放成一摞,将1元的硬币放成一摞,发现...
  • xujinsmile
  • xujinsmile
  • 2012年03月11日 00:07
  • 1602

动态规划算法(后附常见动态规划为题及Java代码实现)

一、基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、...
  • p10010
  • p10010
  • 2015年12月06日 16:52
  • 11841

动态规划-----换钱

题目: 有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法...
  • shijuan0123
  • shijuan0123
  • 2016年08月08日 22:12
  • 214

动态规划(1)

给定数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。 思路:本题可以体现暴力搜索方法,记...
  • suanzhaogao
  • suanzhaogao
  • 2017年05月31日 10:04
  • 217

简单编程题目连载(四)——找零钱

经典动态规划的暴力求解
  • WDZTSXCDH
  • WDZTSXCDH
  • 2017年01月15日 11:48
  • 286

动态规划经典联系题----找零钱

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

动态规划解决找零钱问题

贪心算法在求解找零钱的某些情况时,无法得到全局最优方案;使用动态规划,则可以保证每次都取得最优方案。...
  • littleschemer
  • littleschemer
  • 2015年09月09日 19:03
  • 7286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【刷题之路】零钱凑整问题
举报原因:
原因补充:

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