1034-钞票兑换

代码纯属原创,如有雷同,纯属巧合!

#include <stdio.h>
int main()
{
	int x,y;
	scanf("%d",&x);
	x/=100;
	y=5*x*x+4*x+1;
	printf("%d",y);
	return 0;
}

题解:

我是利用函数关系式y=5x^2+4x+1计算钞票兑换的种类的。

这个函数我是利用Excel计算出来的。其实如果要用手求这个方程,也不难。

下面是那个Excel文件
链接:https://pan.baidu.com/s/1MIdS5XqXSDY8W9QKf39agA 密码:jdx2
那么我是怎么用excel分析的呢?

先找了规律。

100元:
0张50元,可以有5张20元的,1种情况。每一张20元的可以换成2张10元的,有5张20元的,有5种情况。1+5
1张50元,可以有2张20元的和1张10元的,1种情况。每一张20元的又可以换成2张10元的,有2张20元的,有2种情况。1+2
2张50元,只有1种情况。1

最后1+5+1+2+1=10种情况。


200元:
0张50元,可以有10张20元的,1种情况。每一张20元的可以换成2张10元的,有10张20元的,有10种情况。1+10
1张50元,可以有7张20元的和1张10元的,1种情况。每一张20元的可以换成2张10元的,有7张20元的,有7种情况。1+7
2张50元,可以有5张20元的,1种情况。每一张20元的可以换成2张10元的,有5张20元的,有5种情况。1+5
3张50元,可以有2张20元的,1种情况。每一张20元的可以换成2张10元的,有2张20元的,有2种情况。1+2
4张50元,只有1种情况。1
最后1+10+1+7+1+5+1+2+1=29种情况。


按这种规律求出当整百张数(x)为多少时,情况数(y)为多少,放到excel里面找关系。

那个excel文件我百度网盘分享了,大家去看那,我不浪费时间了。

### 动态规划在最少钞票数量问题中的应用 动态规划是一种常用于解决最优化问题的方法,特别适用于具有重叠子问题和最优子结构的问题。在最少钞票数量问题中,目标是使用最少数量的钞票兑换指定金额 $ n $,已知的钞票面额为 1 元、5 元、10 元、20 元、100 元、200 元,并且每种面额可以无限次使用。 #### 算法设计思路 该问题可以通过定义一个一维数组 `dp` 来实现,其中 `dp[i]` 表示兑换金额为 $ i $ 所需的最少钞票数。初始化时,将 `dp[0]` 设为 0(因为兑换 0 元不需要任何钞票),其他值初始化为一个极大值(例如无穷大)。随后,对每个金额从 1 到 $ n $ 进行遍历,并尝试使用所有可用的钞票面额进行更新。 对于每个金额 $ i $ 和每个面额 $ v $,如果 $ i \geq v $,则更新 `dp[i] = min(dp[i], dp[i - v] + 1)`。最终,`dp[n]` 即为兑换 $ n $ 元所需的最少钞票数。 以下是基于上述思路的 C++ 实现代码: ```cpp #include <iostream> #include <vector> #include <climits> using namespace std; int minBills(int n) { vector<int> denominations = {1, 5, 10, 20, 100, 200}; vector<int> dp(n + 1, INT_MAX); dp[0] = 0; for (int i = 1; i <= n; ++i) { for (int v : denominations) { if (i >= v && dp[i - v] != INT_MAX) { dp[i] = min(dp[i], dp[i - v] + 1); } } } return dp[n] == INT_MAX ? -1 : dp[n]; } int main() { int n; cout << "请输入需要兑换的金额: "; cin >> n; int result = minBills(n); if (result != -1) { cout << "最少需要 " << result << " 张钞票。" << endl; } else { cout << "无法兑换该金额。" << endl; } return 0; } ``` #### 说明与扩展 - 上述代码通过动态规划方法解决了最少钞票数量问题,确保了兑换效率[^1]。 - 如果某些钞票面额不可用,则只需修改 `denominations` 向量,删除对应的面额即可。 - 若要输出实际使用的钞票面额,可以在计算过程中记录每一步选择的面额,并回溯得到完整的组合路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值