换零钱_见解

本文介绍了一种使用动态规划解决零钱兑换问题的方法,通过不断更新dp数组来计算N元钱可以有多少种不同的兑换方式。
N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元。
例如:5分钱换为零钱,有以下4种换法:
1、5个1分
2、1个2分3个1分
3、2个2分1个1分
4、1个5分
(由于结果可能会很大,输出Mod 10^9 + 7的结果)
Input
输入1个数N,N = 100表示1元钱。(1 <= N <= 100000)
Output
输出Mod 10^9 + 7的结果
Sample Input
5
Sample Output
4


思路:就是不断的更新dp。
   用1分钱,去满足1到n之间的钱数,可能种类为1.
   用2分钱,去满足2到n之间的钱数,其中i可能种类为,dp[i] + dp[i-2]
 在此,两个注意点,(1)为什么从2开始,因为1的话,他不能用2去组成,也就是说他的开始就是用多少钱,作为开始,低于他,没有办法用他去组成,浪费时间。
(2)为什么,是dp[i] + dp[i-2],因为你看啊,假设i = 5,他用2分钱组成的可能种类是不是以前1分钱的种类,加上dp[3]的种类。(因为3分加上2分就是5分钱,所以3分的种类,每一种加上2分钱,不都是5分钱吗?dp[3]+2=5)此时的每一个dp[i]代表着的就是1和2分钱组成的种类。每一个i代表着,要组成i分钱。每一个dp[i] = dp[i] + dp[i-b[j]],道理就是上面的解释。

代码如下:
  
#include<iostream>
#include<cstdio>
using namespace std;

int a[100005],dp[100005];
int main()
{
    int b[]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000};
    int n,i,j;
    cin>>n;
    dp[0]=1;
    for(j=0;j<13;j++) {
        for(i=b[j];i<=n;i++)
         dp[i]=( dp[i-b[j]] + dp[i] )%1000000007;
    }
    cout<<dp[n]<<endl;
    return 0;
}

换零钱问题有不同的场景和需求,下面别介绍两种不同场景下的 Python 实现。 ### 最小钱币张数(贪心算法) 对于使用贪心算法解决换零钱问题,思路是每次从待换零钱的金额中抽取最大面值的钱币数额,直到金额为零,最后统计各面值钱币的总张数,得到最少钱币张数。以下是示例代码: ```python def greedy_change(amount, denominations): denominations.sort(reverse=True) coin_count = 0 for denomination in denominations: while amount >= denomination: amount -= denomination coin_count += 1 return coin_count # 示例使用 amount = 18 denominations = [1, 9, 10] result = greedy_change(amount, denominations) print(f"最少钱币张数: {result}") ``` 需要注意的是,贪心算法并非在所有货币类型组合下都能得到最优解。例如当货币类型是 1、9、10 元三种,要求凑出 18 元时,贪心算法可能出错。贪心算法会先选 10 元,然后选 8 个 1 元,共 9 张;而最优解是选 2 个 9 元,只需 2 张 [^1]。 ### 在霍格沃茨找零钱 这是一个特定规则下的找零钱问题,涉及到不同货币单位的换算。以下是改进后的代码及注释: ```python def calculate_currency_difference(P, A): # 转换货币值为整数的纳特数 P_knuts = (17 * P[0]) * 29 + (P[1] * 29) + P[2] A_knuts = (17 * A[0]) * 29 + (A[1] * 29) + A[2] # 判断需要输出的信号(正数还是负数) signal = '-' if A_knuts < P_knuts else '' # 计算差值并转换成货币格式 diff = abs(A_knuts - P_knuts) galleons = diff // (29 * 17) sickles = (diff // 29) % 17 knuts = diff % 29 # 返回格式化的货币差值字符串 return f"{signal}{galleons}.{sickles}.{knuts}" # 主函数,用于读取输入和输出结果 def main(): P_input, A_input = input("Enter two currencies separated by space (e.g., 3.12.1 5.15.21): ").split() P = list(map(int, P_input.split('.'))) A = list(map(int, A_input.split('.'))) print(calculate_currency_difference(P, A)) # 调用主函数 if __name__ == "__main__": main() ``` 该代码通过将输入的货币值转换为统一的单位(纳特数),计算差值后再转换回原来的货币格式输出 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值