找钱问题

问题:
有三个人去住旅馆,住三间房,每一间房$10元,于是他们一共付给老板$30,第二天,老板觉得三间房只需要$25元就够了于是叫小弟退回$5给三位客人,谁知小弟贪心,只退回每人$1,自己偷偷拿了$2,这样一来便等于那三位客人每人各花了九元,于是三个人一共花了$27,再加上小弟独吞了不$2,总共是$29。可是当初他们三个人一共付出$30那么还有$1呢? 

解析:
第一天,三个人每人出了10元,总计付出30元;
第二天,三个人每人拿回1元,总计付出27元;加上他们后来拿回的每人1元,就等于30元。

三个人总共付出了27元,其中老板得到了25元,小弟得到了2元。
其实只要想仔细了,一点都没有出错。
 

硬币找钱问题旨在使用最少的硬币个数来完成交易,交易包括付款和找钱两个过程。设有6种不同面值的硬币,各硬币的面值分别为5分,1角,2角,5角,1元,2元。购物时可以使用的各种面值的硬币个数存于数组中,商店里各面值的硬币有足够多[^2]。 #### 问题分析 该问题的目标是在给定各种面值的硬币个数和付款金额的情况下,计算使用硬币个数最少的交易方案。例如,一次购物需要付款0.55元,不同的付款和找钱组合会使用不同数量的硬币,需要找出使用硬币个数最少的方案[^2]。 #### 贪心算法实现及问题 贪心算法的基本思想是每次都选择面值最大的硬币,直到凑够所需金额。以下是一个使用贪心算法解决硬币找钱问题的示例代码: ```cpp #include "iostream" #include "fstream" #include <cstring> using namespace std; /* 最大面值优先 */ int coins[6]; int greedy(double money) { cout << "找钱时用到的钱币有:"; int m[] = {200, 100, 50, 20, 10, 5}; // 硬币面值,单位为分 money = (int)(money * 100); // 将元换为分 int i, j; int count = 0; for(i = 0; i < 6; i++) // 硬币种数 for(j = 1; j <= coins[i]; j++) // 每种硬币的数量 if(money >= m[i]) { money -= m[i]; cout << " " << m[i]; count++; if(money == 0) return count; } return -1; } int main() { ifstream fin("硬币找钱.txt"); int i; double money; while(!fin.eof()) { memset(coins, 0, sizeof(coins)); cout << " 5\t10\t20\t50\t100\t200\n"; cout << "输入各种面值的硬币个数:"; for(i = 0; i < 6; i++) { fin >> coins[5 - i]; cout << coins[5 - i] << "\t"; } cout << "\n输入要找的钱数:"; fin >> money; cout << money * 100 << endl; cout << "\n最少的硬币数为:" << greedy(money); cout << endl; } fin.close(); return 0; } ``` 然而,贪心算法并不一定能得到最优解。贪心算法只考虑当前步骤的最优选择,而不考虑整体的最优性。在某些情况下,贪心算法可能会错过使用更少硬币的方案。 #### 动态规划解决思路 动态规划算法可以解决贪心算法无法得到最优解的问题。动态规划的基本思想是将问题分解为子问题,并保存子问题的解,避免重复计算。对于硬币找钱问题,可以通过定义状态和状态转移方程来求解。 #### 复杂度分析 - **时间复杂度**:贪心算法的时间复杂度为$O(n)$,其中$n$是硬币的种类数。动态规划算法的时间复杂度通常为$O(m * n)$,其中$m$是要找的钱数,$n$是硬币的种类数。 - **空间复杂度**:贪心算法的空间复杂度为$O(1)$,只需要常数级的额外空间。动态规划算法的空间复杂度通常为$O(m)$,需要一个数组来保存子问题的解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值