硬币找零&&爬楼梯&&猴子摘香蕉

硬币找零&&爬楼梯&&猴子摘香蕉

假设有几种硬币,如1、3、5,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。

    1. #include"CoinProblem.h"
    2. #include<iostream>
    3. int countNum=MAX;
    4. void CoinProblem(int *coin,int Length,int Value,int count){
    5. if(Value==0){
    6. if(countNum>count){
    7. countNum=count;
    8. }
    9. return;
    10. }
    11. for(int i=0;i<Length; i++){
    12. if(Value>=coin[i]){
    13. CoinProblem(coin,Length,Value-coin[i],count+1);
    14. }
    15. }
    16. }
    1. #ifndef COIN_PROBLEM_H
    2. #define COIN_PROBLEM_H
    3. #define MAX 65535
    4. extern int countNum;
    5. void CoinProblem(int *coin,int Length,int Value,int count);
    6. #endif
    1. #include"CoinProblem.h"
    2. #include<iostream>
    3. int main(){
    4. int coin[3]={1,3,5};
    5. CoinProblem(coin,3,5,0);
    6. std::cout<<countNum<<std::endl;
    7. }

这些问题都是一类问题,你猴子摘香蕉、硬币找零、爬楼梯等。

这类问题的共同点就是你要问题解决问题,也就是说你要恰好把问是不多不少地解决,不管你怎么摘香蕉,不管你一次

是摘几个,你得把香蕉摘完。你得恰好找别人那么钱,不能多也不能少。爬楼梯也一样啰。。反下是解决问题。

这个不像背包问题,因为背包是不一定能装满的,也就是结束条件是不确定的。

但是我们不要管是不是恰好,因为我们采用了梯归。因为递归的好处是把所有能考虑的问题都考虑了,包括恰好解决问题和

把问题所要求的多,或者少。。

    1. if(Value==0){
    2. if(countNum>count){
    3. countNum=count;
    4. }
    5. return;
    6. }

如上面的代码就是专门用来限制结束条件的,只有当我们找的钱恰好是那么多是,我们才会计数。

于是我们可能通过自己的限定条件来限制要计数的情况。

特注意的是:

?由于我自己的疏忽,导致在以前写这些代码的时候出了些小问题,以前我是这样写的

    1. void CoinProblem(int *coin,int Length,int Value,int count){
    2. if(Value==0){
    3. if(countNum>count){
    4. countNum=count;
    5. }
    6. return;
    7. }
    8. for(int i=0;i<Length; i++){
    9. if(Value>=coin[i]){
    10. CoinProblem(coin,Length,Value-coin[i],++count);
    11. }
    12. }
    13. }

看代码中红色的部分,这里成了++count,这里是改变了count的值,我这意思是改变了在这一次递归运算中的所有count的值,也就是说,i=0时

如count=2,同时也符合条件,也就是说进入那个条件判断语句,于是用++count时会发现count变成了3,这确实是我们所期望的,但是

如果下一次“归”回来后,i=1时,那时发现count一开始就是3了。不再是我们期望的2了。

于是正确的写法应该是这样:

    1. void CoinProblem(int *coin,int Length,int Value,int count){
    2. if(Value==0){
    3. if(countNum>count){
    4. countNum=count;
    5. }
    6. return;
    7. }
    8. for(int i=0;i<Length; i++){
    9. if(Value>=coin[i]){
    10. CoinProblem(coin,Length,Value-coin[i],count+1);
    11. }
    12. }
    13. }

来自为知笔记(Wiz)

硬币找零&&爬楼梯&&猴子摘香蕉

时间: 2024-07-28 15:11:28

硬币找零&&爬楼梯&&猴子摘香蕉的相关文章

硬币找零问题

硬币找零问题一个经典问题,也是阐述动态规划法几乎必讲的一个例子. 硬币找零问题描述:现存在一堆面值为 V1.V2.V3 - 个单位的硬币, 各单位的硬币数目不限, 问最少需要多少个硬币才能找出总值为 T 个单位的零钱? 比如: 假设这一堆面值分别为 1.2.5.21.25 元,需要找出总值 T 为 63 元的零钱. 基于动态规划的思想,我们可以从目标值为 1 元开始计算出最少需要几个硬币,然后再求 2 元.3元- 每一次求得的结果都保存在一个数组中,以后需要用到时则直接取出即可. #includ

硬币找零问题之动态规划

今天我们看一下动态规划的硬币找零问题,主要通过一系列编程题分析动态规划的规律,只要掌握这一规律,许多动态规划的相关问题都可以类比得到. 题目1:给定数组arr,arr中所有的值都是正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 举例: arr[5,2,3],aim=20.  4张5元可以组成20元,其他的找钱方案都要使用更多张的货币,所以返回4. 题解: 一眼看去这道题好像可以用贪心算法可解,但是仔细分析发现有

硬币找零问题的动态规划实现

一,问题描述 给定一组硬币数,找出一组最少的硬币数,来找换零钱N. 比如,可用来找零的硬币为: 1.3.4   待找的钱数为 6.用两个面值为3的硬币找零,最少硬币数为2.而不是 4,1,1 因此,总结下该问题的特征:①硬币可重复多次使用.②在某些情况下,该问题可用贪心算法求解.具体可参考:某种 找换硬币问题的贪心算法的正确性证明 二,动态规划分析 为了更好的分析,先对该问题进行具体的定义:将用来找零的硬币的面值存储在一个数组中.如下: coinsValues[i] 表示第 i 枚硬币的面值.比

nyoj995硬币找零(dp完全背包)

硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此

NYOJ 995 硬币找零

硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此

动态规划求解最多有几种方案求解硬币找零问题

一,问题描述 假设有 m 种面值不同的硬币,存储在 coinsValues数组中,现需要使用这些硬币来找钱,各种硬币的使用个数不限. 求对于给定的钱数N,我们最多有几种不同的找钱方式.硬币的顺序并不重要. 二,动态规划分析 为了更好的分析,先对该问题进行具体的定义:将用来找零的硬币的面值存储在一个数组中.如下: coinsValues[i] 表示第 i 枚硬币的面值.比如, 第 i 枚硬币     面值 1                1 2                3 3       

DP:硬币找零

在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资.我们应该注意到,人民币的硬币系统是100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是:我们可能没有这样一种好的硬币系统,因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还不能用这些硬币找零.例如,如果硬币系统是40,30

硬币找零-记忆化搜索(DP动态规划)

硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此

算法笔记——硬币找零之最少硬币数

题目来源:NYOJ995 问题描述: 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还