【动态规划法】硬币找零问题

简介: 【动态规划法】硬币找零问题

 1、题目如下:

【问题描述】

给定 n 种不同面值的硬币,分别记为 c[0], c[1], c[2], … c[n],假设每种硬币的数量是无限的。同时还有一个总金额 k,编写一个动态规划计算出最少需要几枚硬币凑出这个金额 k?

【样例输入】

12

1 2 5

【样例输出】

3

【样例说明】输入第一行为金额总数,第二行为硬币的不同面值;输出为需要的最少硬币数

2、算法思路

1、方法:动态规划法

2、dp[0]=0,从dp[1]开始,运算直至dp[MoneySum]。

3、动态转移方程:if(i-c[j]>=0) dp[i]=min(dp[i],dp[i-c[j]]+1);

注:输入数据的第二行以'\n'结尾,其中数据以空格间隔(详见代码)。

3、代码如下:

#include <bits/stdc++.h>
using namespace std;
#define N  10000
int MoneySum;//金额和 
int c[N];//硬币金额存储数组 
int dp[N];//所需最少硬币个数存储数组 
int main(){
  cin>>MoneySum;//输入金额和 
  int n=0;//记录硬币种类个数 
  for (int i= 0;i<=9; i++)
  {
    cin >> c[i];
    n++;//硬币种类个数加1 
    if (getchar()=='\n') break;//输入回车,则结束 
  }
  for(int i=0;i<=MoneySum;i++){//赋初值10000 
    dp[i]=N;
  }
  dp[0]=0;//记得将dp[0]初始化为0,当金额为0时,所需最少金币为0 
  for(int i=1;i<=MoneySum;i++){
    for(int j=0;j<n;j++){
      if(i-c[j]>=0) dp[i]=min(dp[i],dp[i-c[j]]+1);
      //cout<<"dp["<<i<<"]:"<<dp[i]<<endl;
    }
  }
  cout<<dp[MoneySum]<<endl;
  return 0;
}

image.gif


目录
相关文章
|
2月前
|
算法
【算法】贪心算法——柠檬水找零
【算法】贪心算法——柠檬水找零
|
5月前
|
算法 测试技术 C++
【状态压缩 容斥原理 组合数学】3116. 单面值组合的第 K 小金额
【状态压缩 容斥原理 组合数学】3116. 单面值组合的第 K 小金额
【状态压缩 容斥原理 组合数学】3116. 单面值组合的第 K 小金额
|
5月前
|
算法
【贪心算法】|860.柠檬水找零
【贪心算法】|860.柠檬水找零
|
算法
【递归算法题】硬币表示
【递归算法题】硬币表示
99 0
|
算法 Java Python
深入理解动态规划算法 | 凑硬币
深入理解动态规划算法 | 凑硬币
125 0
|
算法 Java
动态规划算法-凑硬币
动态规划算法-凑硬币
113 0
|
缓存 算法
钞票找零-贪心,动态规划算法
钞票找零-贪心,动态规划算法
116 1
AcWing 656. 钞票和硬币
AcWing 656. 钞票和硬币
83 0
AcWing 656. 钞票和硬币
|
算法 Python
动态规划法(二)找零钱问题
  本次博客尝试以storyline的方式来写作,如有不足之处,还请多多包涵~~ 问题的诞生   我们故事的主人公叫做丁丁,他是一个十几岁的小男孩,机智聪颖,是某某杂货店的小学徒。
2905 0