PTA 换硬币

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

代码:

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	
	int x,y,z;
	int i,j,k=0;
	x=n/5;
	for(i=x;i>=1;i--)
	{
		y=(n-5*i)/2;
		for(j=y;j>=1;j--)
		{
			z=n-5*i-2*j;
			if(z>0){//z不为0可输出 
				printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,z,i+j+z);
				k++ ;
			}
		}	
	}
	printf("count = %d",k);	
	return 0;
	
}

 

### 硬币算法 C++ 实现 硬币问题是经典的动态规划问题之一,目标是找到能够组成特定总金额所需的最少硬币数量。以下是基于动态规划方法的 C++ 实现: #### 动态规划核心思想 创建一个大小为 `amount + 1` 的数组 `dp`,其中 `dp[i]` 表示凑成金额 `i` 所需的最少硬币数。初始时将所有值设为正无穷大(表示不可达),并将 `dp[0]` 设为 0(因为凑成金额 0 不需要任何硬币)。通过迭代更新每个子问题的结果来逐步构建最终解。 #### 源代码实现 以下是一个完整的 C++ 实现代码[^3]: ```cpp #include <iostream> #include <vector> #include <climits> using namespace std; int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount + 1, INT_MAX); dp[0] = 0; for (int i = 1; i <= amount; ++i) { for (const auto& coin : coins) { if (i >= coin && dp[i - coin] != INT_MAX) { dp[i] = min(dp[i], dp[i - coin] + 1); } } } return dp[amount] == INT_MAX ? -1 : dp[amount]; } int main() { vector<int> coins = {1, 2, 5}; // 可选硬币面额 int amount; cout << "请输入要兑的总金额: "; cin >> amount; int result = coinChange(coins, amount); if (result != -1) { cout << "最少需要的硬币数量为: " << result << endl; } else { cout << "无法用给定硬币凑成该金额" << endl; } return 0; } ``` #### 运行逻辑说明 上述程序实现了 LeetCode 零钱兑问题的核心功能[^4]。它接受一组硬币面额以及目标金额作为输入,并输出所需最少硬币数目或者 `-1` 来表明不可能完成兑。具体过程如下: - 初始化动态规划表 `dp` 并设定边界条件。 - 对于每一个金额值 `i` 和每一种可用硬币 `coin`,尝试更新当前状态下的最优解。 - 如果最后的状态仍保持未被修改,则返回 `-1`;否则返回对应的最小硬币计数值。 此解决方案的时间复杂度主要由两层嵌套循环决定,即 O(n * m),其中 n 是目标金额而 m 则代表硬币种类总数[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值