Exercise(3):最少硬币问题

/*  
        陈潼升
        最少硬币问题
        问题描述
    设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。
    可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
    编程任务:对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。

    Input
    输入包括多组测试数据,每组输入的第一行中只有1 个整数给出n的值,第2 行起每行2 个数,分别是T[j]和Coins[j]。每组输入最后1 行是要找的钱数m。
    Output
    对于每组输入数据,输出一行,即计算出最少硬币数。问题无解时输出-1。

    Sample Input
    3
    1 3
    2 3
    5 3
    18
    Sample Output
    5

*/
/*
    将一个问题分裂成n个子问题,求出子问题的解并用子问题的解出问题的答案。即为动规

    问题分析 :
    给m找零 可分为 找1块,找2块,找3块,找4块......找m块。 
        定义长度为m的数组dp[1...m],用其存放一系列子问题的结果,
    即dp[i]为要凑i块钱所需最少硬币数,则dp[m]为本题答案.
    当前要找的钱数为i(1<i<m);
    当前所试探的硬币面值为k; 
    1、当i和k相等时,结果为1,即dp[i] = 1;
    2、当i大于k时,若dp[i]为0(即未赋过值),且dp[i-k]不为0(即从i元中刨去k元后剩下的钱可以找开)
                   则dp[i] = dp[i-k]+1;
                   若dp[i]不为0(即已赋值),
                   则dp[i] =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值