首页 > 其他分享 >02.凑零钱问题

02.凑零钱问题

时间:2023-05-25 09:47:01浏览次数:37  
标签:02 int res coins dic 问题 零钱 amount var

先看下题目:给你 k 种面值的硬币,面值分别为 c1, c2 ... ck,每种硬币的数量无限,再给一个总金额 amount,问你最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。算法的函数签名如下:

// coins 中是可选硬币面值,amount 是目标金额
int coinChange(int[] coins, int amount);

1、暴力解法

public int CoinChange(List<int> coins, int amount)
{
    //base case
    if (amount == 0) return 0;
    if (amount < 0) return -1;

    var res = int.MaxValue;

    foreach (var coin in coins)
    {
        var subproblem = CoinChange(coins, amount - coin);
        //子问题无解直接跳过
        if (subproblem == -1) continue;

        if (1 + subproblem < res)
            res = 1 + subproblem;
    }

    if (res == int.MaxValue) return -1;
    return res;
}

2、带备忘录的递归

public int CoinChange(List<int> coins, int amount)
{
    var dic=new Dictionary<int,int>();
    return Helper(dic, coins, amount);
}

public int Helper(Dictionary<int,int> dic,List<int> coins,int amount)
{
    if (dic.ContainsKey(amount)) return dic[amount];

    //base case
    if (amount == 0) return 0;
    if (amount < 0) return -1;

    var res = int.MaxValue;
    foreach (var coin in coins)
    {
        var subproblem = Helper(dic, coins, amount - coin);
        if(subproblem==-1) continue;

        if (subproblem + 1 < res) res = subproblem + 1;
    }

    //返回值前,先向备忘录添加数据
    if (res == int.MaxValue) dic[amount] = -1;
    else dic[amount] = res;

    return dic[amount];
}

3、dp 数组的迭代解法

 public int CoinChange(List<int> coins, int amount)
{
    //数组大小为amount+1,初始值设置为amount+1
    var dp = new int[amount + 1];
    for (var i = 0; i < dp.Length; i++) dp[i] = amount + 1;
    //base case
    dp[0] = 0;

    for(var i = 0; i < dp.Length; i++)
    {
        foreach (var coin in coins)
        {
            if(i-coin<0) continue;

            if (1 + dp[i - coin] < dp[i]) dp[i] = 1 + dp[i - coin];
        }
    }

    if (dp[amount] == amount + 1) return -1;
    return dp[amount];
}

标签:02,int,res,coins,dic,问题,零钱,amount,var
From: https://www.cnblogs.com/huiteresa/p/17430250.html

相关文章

  • SSO2.0 9-20230524
              ......
  • 关于如何处理httpOnly的问题?
    写这篇的目的是,今天在重新学习javascript时发现了HttpOnly这个标签,所以专门的mark了下。谁在什么时候发明了HttpOnly2002年微软为ie6的sp1创造了HttpOnly什么是HttpOnlyHttpOnly是包含在http返回头Set-Cookie里面的一个附加的flag,所以它是后端服务器对cookie设置的一个附加......
  • 02-Node.js的包管理工具
    00.代码共享方案模块化的编程思想,支持将代码划分成一个个小的、独立的结构。我们可以通过模块化的方式来封装自己的代码,将之封装成一个工具;这个工具我们可以让同事通过导入的方式来使用,甚至也可以分享给世界各地的程序员来使用;假如,我们要将某个工具分享给世界上所有的程序员......
  • AtCoder Beginner Contest 302 H. Ball Collector 题解
    AtCoderBeginnerContest302H.BallCollector题意跳过。可以视作将\(a_i,b_i\)之间连了一条边,然后\(a_i,b_i\)之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无法被选择上;而对于包含至少一个......
  • 2023-5-24
    忙碌结束的结束了两个ddl,看完了《刑事ZERO》嗯,,忘了还有啥评价是还算快乐评价是德语难念(虽然就是个书名未结束的后面要处理的事情大概就是人工智能,机器人和GameJam(中间一个CSP应该做点别的事情了,这两天《夜の向日葵》也练到了难点发现口琴还是需要下功夫练的看《LegalHi......
  • 【Git】解决Untracked Files Prevent Checkout的问题
    本文目录一、背景描述二、问题原因三、解决方案3.1方案1--删除文件3.2方案2--提交这些文件3.3方案2--git命令切换分支一、背景描述使用的工具:Windows10+Idea+Git今天从Git服务器上通过GitBashHere(如下图所示),克隆下来一个新的项目,此时一般都是master分支。此时使用Idea......
  • 2023 (ICPC) Jiangxi Provincial Contest -- Official Contest
    2023(ICPC)JiangxiProvincialContest--OfficialContest A-DrillWoodtoMakeFire思路:n>=s*vB-WonderfulArray思路:对a进行a%m,不会对结果造成影响,则0<=bi+1-bi<m。可以求bi+1%m<bi%m的个数,等价于bi+1/m>bi/m,整体来看,就是求bn/m#include<bits/stdc++.h>using......
  • 【ElasticSearch】关于es跨域的问题
    本文目录一、使用es的head插件二、其他说明一、使用es的head插件在使用es的head插件时,默认的9100,需要访问es的默认端口9200时,会出现跨域问题,此时只需要修改一下es的配置文件即可。在elasticsearch.yml中添加开启跨域的配置:http.cors.enabled:truehttp.cors.allow-origin:"*"说明......
  • 2023/5/24每日随笔 项目基本实现
    今天,上了几节课,然后进行项目的完善与基本实现一:实现了调用相册,将地址提取二:实现了图片提取加分类三:实现了添加后更新四:结果展示五:项目问题以及可能出现bug一:实现了调用相册,将地址提取具体更改的这个方法:完整代码来自《第一行代码》调用相册和使用相机。更改后调用的相册可......
  • 2023.5.24
     1#include<iostream>2#include<iomanip>3usingnamespacestd;4classHorse5{6public:7Horse()8{9cout<<"Horse申请了空间..."<<endl;10}11virtual~Horse()12{13......