硬币问题(动态规划)

题目描述:

今有无限的面值为1,5,11元的硬币。
给定n,问:至少用多少枚硬币,可以恰好凑出n元?

输入格式:

一个整数n。

输出格式:

一个整数,表现最少的硬币数。

样例输入:

15

样例输出:

3

提示:

数据范围:1≤n≤10000

时间限制: 1000ms
空间限制: 256MB

代码如下:

#include <bits/stdc++.h>
using namespace std;
int f[10001]={}; 
int main(){
    int n;
	cin>>n;
    for(int i=1;i<=n;i++){
        f[i]=f[i-1]+1;
        if(i-5>=0){
        	f[i]=min(f[i],f[i-5]+1);
		}
        if(i-11>=0){
        	f[i]=min(f[i],f[i-11]+1);
		}
    }
    cout<<f[n];
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
硬币问题是一个著名的动态规划问题,其描述为:给定不同面额的硬币和一个总金额,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。 例如,假设有三种面值的硬币,分别为1元、2元、5元,需要凑成11元,那么最少需要的硬币数为3枚(5元+5元+1元)。 解决这个问题的一种常见方法是使用动态规划。具体来说,我们定义一个长度为amount+1的数组dp,其中dp[i]表示凑成金额i所需的最少硬币个数。初始时,dp[0]=0,表示凑成金额0不需要任何硬币。对于每个金额i,我们遍历所有的硬币面值j,如果j<=i,则可以使用一枚面值为j的硬币,将问题转化为求解凑成金额i-j所需的最少硬币个数,即dp[i-j]+1。我们只需要选择所有方案中最小的那个作为dp[i]的值即可。 最终,dp[amount]就是所求的答案。 下面是一个使用Python实现的动态规划算法: ```python def coinChange(coins, amount): dp = [float('inf')] * (amount + 1) dp[0] = 0 for i in range(1, amount + 1): for j in coins: if j <= i: dp[i] = min(dp[i], dp[i - j] + 1) return dp[amount] if dp[amount] != float('inf') else -1 ``` 在上面的代码中,coins表示硬币面值列表,amount表示需要凑成的金额。我们首先初始化dp数组,将所有元素设置为正无穷,然后将dp[0]设为0。接下来,我们遍历所有的金额i,对于每个金额i,再遍历所有的硬币面值j,如果j<=i,则更新dp[i]的值为dp[i-j]+1和dp[i]中的较小值。最后返回dp[amount]的值,如果它仍然是正无穷,则说明无法凑成金额amount,返回-1即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值