change coins

描述

给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.

你可以假设每种硬币均有无数个

您在真实的面试中是否遇到过这个题?  是

样例

给出 coins = [1, 2, 5], amount = 11
返回 3 (11 = 5 + 5 + 1)
给出 coins = [2], amount = 3
返回 -1

#include <iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N =100;
const int INF = 2147483640;
int a[N];
int n;
typedef long long int LL;
int beibao(int amount) {//这个函数为求数额为amount的时候所需要的最小硬币数
	if (amount == 0)
		return 0;//如果数额为零就不需要硬币
	if (amount < 0) {
		return INF;//如果数额为负数,代表拼不出数 ,就设为正无穷
	}
	int pre = beibao(amount - a[1]) + 1;
	for (int i = 2; i <= n; i++) {		//比较各种方案
		pre = min(pre, beibao(amount - a[i])+1);
	}
	return pre;
}
int main()
{
	int amount;
	cin >> n;//不同面值货币的数量
	cin >> amount;//要拼出的数额值
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}

	cout << beibao(amount) << endl;

	return 0;
}
   

 

提供的参考引用中未包含关于最小化硬币数量问题的相关信息。 最小化硬币数量问题通常是指在给定不同面额的硬币和一个目标金额的情况下,找出使用最少数量的硬币来凑成该目标金额的方案。这是一个经典的动态规划问题,以下是使用Python实现的解决方案: ```python def coinChange(coins, amount): # 创建一个长度为 amount + 1 的数组 dp,初始值为无穷大 dp = [float('inf')] * (amount + 1) # 目标金额为 0 时,所需硬币数量为 0 dp[0] = 0 # 遍历从 1 到 amount 的每个金额 for i in range(1, amount + 1): # 遍历每种硬币面额 for coin in coins: if i - coin >= 0: # 更新 dp[i] 的值,取当前值和使用该硬币后的最小值 dp[i] = min(dp[i], dp[i - coin] + 1) # 如果 dp[amount] 仍然是无穷大,说明无法凑出目标金额,返回 -1 return dp[amount] if dp[amount] != float('inf') else -1 # 示例使用 coins = [1, 2, 5] amount = 11 result = coinChange(coins, amount) print(f"最少需要的硬币数量: {result}") ``` ### 代码解释 1. **初始化 `dp` 数组**:创建一个长度为 `amount + 1` 的数组 `dp`,初始值为无穷大。`dp[0]` 初始化为 0,表示目标金额为 0 时所需硬币数量为 0。 2. **状态转移方程**:对于每个金额 `i`,遍历每种硬币面额 `coin`,如果 `i - coin >= 0`,则更新 `dp[i]` 为 `min(dp[i], dp[i - coin] + 1)`。 3. **返回结果**:如果 `dp[amount]` 仍然是无穷大,说明无法凑出目标金额,返回 -1;否则返回 `dp[amount]`。 ### 复杂度分析 - **时间复杂度**:$O(amount * n)$,其中 `amount` 是目标金额,`n` 是硬币面额的种类数。 - **空间复杂度**:$O(amount)$,主要用于存储 `dp` 数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值