C语言编程之换硬币

news/2024/11/29 8:45:40/

现在有这样一道题。假设给你一分硬币,两分硬币,五分硬币共60枚。需要将它们兑换成100分的硬币,可以怎么换?

而我们可以列出如下关系式
假设x,y,z分别为一分,两分,五分硬币则:
x+y+z=60
x+2y+5z=100
对于这道题我们应该不太陌生,而我们最常见的应该是用三重循环来解决问题,又因为其为三重循环则需要三个未知数:
代码如下:

#include<stdio.h>
int main(void)
{int coin1,coin2,coin5;for(coin1=0;coin1<=60;coin1++)//一分硬币可以等于硬币总数最大值,不超过100分 for(coin2=0;coin2<=50;coin2++)//两分五分硬币数目最大不应超过钱数/其面额 for(coin5=0;coin5<=20;coin5++)//减少循环次数,降低其时间复杂度{if(coin1+coin2+coin5==60&&1*coin1+2*coin2+5*coin5==100)printf("一分硬币%d枚,两分硬币%d枚,五分硬币%d枚\n",coin1,coin2,coin5);} return 0;
} 

而这也是暴力解法,三重循环则会使其时间复杂度为O(n3),我们应降低其循环次数
若用二重循环,则需要两个未知数,我们只需将以上关系式消去一个未知数,当然消去哪个都可以,(我消去的是x)在我们利用了加减消元法之后可以得到以下关系式:
y+4z=40
最后再利用x=60-y-z,得到x即可
代码如下:

#include<stdio.h>
int main(void)
{int coin1,coin2,coin5;for(coin2=0;coin2<=50;coin2++)for(coin5=0;coin5<=20;coin5++)//减少循环次数,降低其时间复杂度{if(coin2+4*coin5==40){coin1=60-coin2-coin5;printf("一分硬币%d枚,两分硬币%d枚,五分硬币%d枚\n",coin1,coin2,coin5);}} return 0;
} 

而最后的优化就是时间复杂度最低的一重循环了,所以我们应想办法将其变为一个未知数代替的关系式,而这需要我们找寻其隐含的条件。
我们可以将y,z变为关于x的关系式,即:
由y+4z=40,x+y+z=60得
z=1/3(x-20)
y=1/3(200-4x)
而且y,z必须大于等于0则有20<=x<=50
梳理完毕,代码如下:

#include<stdio.h>
int main(void)
{int coin1,coin2,coin5;for(coin1=20;coin1<=50;coin1++){coin5=(coin1-20)/3;coin2=(200-4*coin1)/3;if(coin1+coin2+coin5==60)printf("一分硬币%d枚,两分硬币%d枚,五分硬币%d枚\n",coin1,coin2,coin5);           }return 0;
} 

这就是换硬币循环的逐步优化了,总而言之就是几重循环需要几个未知数,最后只需寻找其潜在关系。这需要我们努力思考,fighting!


http://www.ppmy.cn/news/545941.html

相关文章

洛谷-硬币翻转

题目&#xff1a; 题目描述 在桌面上有一排硬币&#xff0c;共N枚&#xff0c;每一枚硬币均为正面朝上。现在要把所有的硬币翻转成反面朝上&#xff0c;规则是每次可翻转任意N-1枚硬币&#xff08;正面向上的被翻转为反面向上&#xff0c;反之亦然&#xff09;。求一个最短的操…

计算机中¥符号按哪个键,人民币符号(¥)

&#xffe5;是下列两种货币的货币符号: 人民币(CNY) 日元(JPY) 因为以上两种货币的单位都是圆(圆&#xff0f;元&#xff0f;円)&#xff0c;日语发音为en。符号由拉丁字母"Y"和两道平行水平线组成。中国大陆早期多使用一道水平线&#xff0c;现时则多使用两道水平线…

矩阵翻硬币

问题描述小明先把硬币摆成了一个 n 行 m 列的矩阵。随后&#xff0c;小明对每一个硬币分别进行一次 Q 操作。对第x行第y列的硬币进行 Q 操作的定义&#xff1a;将所有第 i*x 行&#xff0c;第 j*y 列的硬币进行翻转。其中i和j为任意使操作可行的正整数&#xff0c;行号和列号都…

python模拟硬币_python实现简单随机模拟——抛呀抛硬币

还是在上次提到的数据之魅那本书&#xff0c;看到模拟这章&#xff0c;有个python模拟脚本&#xff0c;但书上不全&#xff0c;就自己简单写了下。 流程&#xff1a;在不同的平衡参数p(为0.5时为均匀的)下&#xff0c;模拟60次实验&#xff0c;每次投硬币8次&#xff0c;统计正…

MATLAB硬币定位

1&#xff0c;获取图片 clear all; clc; imimread(‘coin.jpg’); 2&#xff0c;灰度化&#xff0c;并且进行均值滤波 imm rgb2gray(im); %均值滤波 imgrayfilter2(fspecial(‘average’,5),imm)/255; 3&#xff0c;腐蚀膨胀减运算 %腐蚀膨胀相减弱化背景 elest…

人民币问题

1044: 人民币问题 [水题] 时间限制: 1 Sec 内存限制: 128 MB 提交: 180 解决: 129 统计 题目描述 给出任意的人民币( ≤100 ≤100元)。 求兑换成5元、2元和1元币值&#xff08;要求三种币值均有&#xff09;的方法有多少种。 输入 输入任意的人民币( ≤100 ≤100元)的整币。…

钱币组合方式

假设我们有无限多的1元&#xff0c;2元&#xff0c;5元&#xff0c;10元&#xff0c;20元&#xff0c;50元&#xff0c;100元&#xff0c;200元的钱币&#xff0c;那么为了组合成一个200元的钱币&#xff0c;共有多少种组合方式&#xff1f; 比如说&#xff1a; 200 110015022…

比特币技术原理

目录 比特币的兴起 1.以物易物 2.实物货币 3.符号货币 4.中央系统虚拟货币 5.分布式虚拟货币 比特币原理 三大核心问题 问题1——记账必要性 问题2——以谁为准 问题3——如何防伪 RSA算法 数字签名 比特币的优缺点 优点&#xff1a; 缺点 参考链接 PPT&…