C++程序 最少硬币问题

合集下载

硬币翻转c语言

硬币翻转c语言

硬币翻转c语言
以下是使用C语言编写的硬币翻转程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int heads = 0, tails = 0;
srand(time(NULL)); // 初始化随机数生成器
for (int i = 0; i < 10; i++) {
int result = rand() % 2; // 生成0或1的随机数
if (result == 0) {
heads++; // 正面朝上计数加1
printf("正面\n");
} else {
tails++; // 反面朝上计数加1
printf("反面\n");
}
}
printf("正面朝上的次数:%d\n", heads);
printf("反面朝上的次数:%d\n", tails);
return 0;
}
```
该程序使用随机数生成器模拟硬币翻转的过程,每次生成0或1的随机数,0表示正面朝上,1表示反面朝上。

程序循环执行10次硬币翻转,并分别统计正面和反面朝上的次数,最后输出结果。

1。

c语言第一次作业程序题pta

c语言第一次作业程序题pta

5-1 统计学生平均成绩与及格人数 (15分)本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。

题目保证输入与输出均在整型范围内。

输入格式:输入在第一行中给出非负整数N,即学生人数。

第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:按照以下格式输出:其中平均值精确到小数点后一位。

输入样例:输出样例:int main(){int n,i,count=0,a[10000];double sum=0,aver;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++){if(a[i]>=60)count++;sum=sum+a[i];}if(n!=0)aver=sum/n;printf("average = %.1f\ncount = %d\n",aver,count);}5-3 大炮打蚊子(15分)现在,我们用大炮来打蚊子:蚊子分布在一个M\times N M×N格的二维平面上,每只蚊子占据一格。

向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意:其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。

若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。

也就是说,一次命中或者两次杀伤均可消灭蚊子。

现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数。

输入格式:第一行为两个不超过20的正整数M和N,中间空一格,表示二维平面有M行、N列。

接下来M行,每行有N个0或者#字符,其中#表示所在格子有蚊子。

接下来一行,包含一个不超过400的正整数k,表示发射炮弹的数量。

最后k行,每行包括一发炮弹的整数坐标x和y(0\le≤x<<M,0\le≤y<<N),之间用一个空格间隔。

找换硬币问题证明

找换硬币问题证明

将M 分钱找换为硬币面值为C n-1,C n-2,…,C 0的硬币,求所需硬币数最少的找换方案。

证明贪心法所得的解X=(x n-1,x n-2,…,x 0)即是最优解。

解:用贪心法,将M 分钱尽可能找换为面值为C n-1的硬币,剩余的分值再尽可能找换为面值为C n-2的硬币,以此类推。

所得的找换方案所需硬币数最少。

证明:贪心法求得的是最优解(反证法)假设贪心法所得的解X=(x n-1,x n-2,…,x 0)并非最优解,而是另有Y=(y n-1,y n-2,…,y 0)为最优解。

则一定有: x i c i 0i =n−1= y i c i 0i =n−1=M ——(1)且易知:最优解中(除面值为C n-1的硬币以外,其他)任何一种硬币的个数y i 一定小于C 。

因为若某一种面值为C i-1的硬币个数≥C ,则将C 个面值为C i-1的硬币用一个C i 面值的硬币来取代,可获得比最优解中的硬币数更少的硬币数,即获得更优解。

因此 y i c i <0i =k−1 c −1 c i =(c −1)c k −1c −10i =k−1=c k −1<c k ——(2)即所有面值小于C k 的硬币面值之和,一定小于C k 。

从前向后依次比较X 和Y 中的解分量,若首个不相等的解分量下标为k ,则定有x k >y k (因为在贪心法求解时,x k 已是当前情况下面值为C k 的硬币所能取的最大个数)。

又因为x k 和y k 均为整数,因此x k -y k ≥1。

由于(1)式中下标n-1~k+1的分量均相等,因此可将(1)式简化为:x i c i 0i =k = y i c i 0i =k即: y i c i 0i =k−1= x i c i +(x k −y k )0i =k−1c k >c k ——(3)显然(2)式和(3)式产生矛盾,因此假设不成立,贪心法求得的解就是最优解。

得证!。

硬币翻转c语言

硬币翻转c语言

硬币翻转c语言硬币翻转是一个常见的概率问题,也是一个经典的数学问题。

在这个问题中,我们有一个正面和反面都有标记的硬币。

当我们将这枚硬币同时抛掷时,有两种结果:正面向上和反面向上。

那么,假设我们连续进行n次硬币翻转,请问在n次翻转中,正面向上的概率是多少?首先,让我们来看看一个简单的情况,假设我们只进行一次硬币翻转。

那么在这种情况下,正面向上的概率只有50%。

这是因为一枚硬币只有两个面,正面和反面,它们的出现概率是相等的。

接下来,我们进一步探讨二次硬币翻转的情况。

此时,我们可以列举出所有可能的结果:正面正面、正面反面、反面正面和反面反面。

每一种结果的出现概率都是相等的,都是1/4。

而正面向上的结果出现的次数有两种,所以正面向上的概率为2/4,即50%。

同样地,我们可以推测在3次硬币翻转中,正面向上的概率也是50%。

那么,我们是否可以得出结论,在任意次数的硬币翻转中,正面向上的概率都是50%呢?事实上,根据概率论的知识,我们可以使用概率的加法原则和乘法原则,来计算在多次硬币翻转中正面向上的概率。

首先,我们可以使用加法原则。

当我们进行两次硬币翻转时,有以下四种可能的结果:正面正面、正面反面、反面正面和反面反面。

每一种结果的出现概率都相等,都是1/4。

而正面向上的结果出现的次数有两种,所以正面向上的概率为2/4,即50%。

接着,当我们进行三次硬币翻转时,有以下八种可能的结果:正正正、正正反、正反正、正反反、反正正、反正反、反反正和反反反。

每一种结果的概率都是1/8。

而正面向上的结果出现的次数有四种,所以正面向上的概率为4/8,即50%。

通过这种方式,我们可以推测在任意次数的硬币翻转中,正面向上的概率都是50%。

然而,硬币翻转问题之所以引起了许多数学家的兴趣,是因为有时出现了一些意想不到的结果。

例如,在进行大量次数的硬币翻转实验中,我们会发现正面向上的个数通常会接近总次数的一半,但并不完全等于它。

这是因为概率是一种理论预测,而实际的结果受到许多随机因素的影响。

贪心算法几个经典例子c语言

贪心算法几个经典例子c语言

贪心算法几个经典例子c语言1. 零钱兑换问题题目描述:给定一些面额不同的硬币和一个总金额,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。

如果没有任何一种硬币组合能够凑出总金额,返回 -1。

贪心策略:每次选择面额最大的硬币,直到凑出总金额或者无法再选择硬币为止。

C语言代码:int coinChange(int* coins, int coinsSize, int amount){int count = 0;for(int i = coinsSize - 1; i >= 0; i--){while(amount >= coins[i]){amount -= coins[i];count++;}}return amount == 0 ? count : -1;}2. 活动选择问题题目描述:有 n 个活动,每个活动都有一个开始时间和结束时间,选择一些活动使得它们不冲突,且能够参加的活动数最多。

贪心策略:每次选择结束时间最早的活动,直到所有活动都被选择或者无法再选择为止。

C语言代码:typedef struct{int start;int end;}Activity;int cmp(const void* a, const void* b){return ((Activity*)a)->end - ((Activity*)b)->end;}int maxActivities(Activity* activities, int n){qsort(activities, n, sizeof(Activity), cmp);int count = 1;int end = activities[0].end;for(int i = 1; i < n; i++){if(activities[i].start >= end){count++;end = activities[i].end;}}return count;}3. 跳跃游戏题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。

OpenJudge算法设计与分析习题解答

OpenJudge算法设计与分析习题解答
}
3、鸡兔同笼
描述
一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。已经知道了笼子里面脚的 总数 a,问笼子里面至少有多少只动物,至多有多少只动物。
输入
一行,一个正整数 a (a < 32768)。
输出
一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格 分开。 如果没有满足要求的答案,则输出两个 0,中间用一个空格分开。
样例输入
45 2 3 2 1
样例输出
1 BeiJu 1 BeiJu 源代码: #include <stdio.h> #include <string.h> int b[ 222 ]; int a[ 222 ]; int n, m;
int main() {
scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++ ){
if(lef >= righ) { return ;
} int mid = lef + (righ - lef) / 2; reSeq(seq, lef, mid);
reSeq(seq, mid + 1, righ); int totalSize = righ - lef + 1; long long tmp[totalSize]; int n = lef; int m = mid + 1; int i = 0; while(n <= mid || m <= righ) {
输入
无输入
输出
按照饭量大小输出 3 人顺序,比如: ABC

浙大c程题库答案

浙大c程题库答案

浙大c程题库答案20011求华氏温度100°F对应的摄氏温度。

220012求华氏温度150°F对应的摄氏温度。

320013求摄氏温度26°C对应的华氏温度。

320015当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)和百位数字(digit3)的值。

320026输入2个整数num1和num2,计算并输出它们的和、差、积、商与余数。

4第3周(M3)520031求1+2+3+......+100(调试示例error02_5)520032求m+(m+1)+(m+2)+......+100520033求1/m+1/(m+1)+1/(m+2)+......+1/n620034求1+1/3+1/5+......的前n项和720035求1-1/4+1/7-1/10+……的前n项之和720036输出华氏-摄氏温度转换表(改错题error02_6)820038求某的n次幂920041生成3的乘方表1020044求100^0.5+101^0.5+……+1000^0.51020053计算物体自由下落的距离1120056计算分段函数1120061阶梯电价1220062求m某m+1/m+(m+1)某(m+1)+1/(m+1)+(m+2)某(m+2)+1/(m+2)+......+n某n+1/n1320063求1-2/3+3/5-4/7+5/9-6/11+ (14)20064求2^1+2^2+2^3+……+2^n15第4周(M4)1510007显示图案(复习printf()的字符串输出)1520042生成阶乘表1620043使用函数求n!/(m!某(n-m)!)1620054求平均值1720057求1+1/2+1/3+......+1/n1820065求0!+1!+2!+……+n!1840015求最小值1940018求a+aa+aaa+aa…a20第5周(M5)2130001求一元二次方程的根2130002求分段函数的值2330003分类统计字符2330004显示五级记分制成绩所对应的百分制成绩区间(使用witch)24 30005显示水果的价格(使用witch)2530007求三角形的面积和周长2730008计算个人所得税2830051判断闰年2930052统计学生平均成绩与及格人数3030053分段计算水费(使用嵌套的if-ele语句)31浙大c程序语言设计(第2版)题库答案40011求最小公倍数和最大公约数(调试示例error04_1)32 40012求1-1/4+1/7-1/10+1/13-1/16+ (33)40014求整数的位数3440023换硬币3540024找出各位数字的立方和等于它本身的数3640025找完数(改错题error04_2)3840027从高位开始逐位输出一个整数的各位数字(选作)39 40052判断素数4040053逆序输出整数4140054输出斐波那契序列42第7周(M7)4250002使用函数判断数的符号4250003使用函数求奇数和4350005使用函数统计素数并求和4450006使用函数统计一个整数中数字的个数4550007使用函数找水仙花数4650009使用函数求余弦函数的近似值4850052使用函数找最大值4950062使用函数输出指定范围内的Fibonacci数50 50063使用函数找出指定范围内的完数51第8周(M8)5240013求奇数和5240062求某+某某某/2!+某某某某某/3!+某某某某某某某/4!+……的值5350004使用函数计算两点间的距离5450061使用函数求a+aa+aaa+aa…a5560002整数的十进制、八进制和十六进制表现形式5660003分类统计字符5760006验证歌德巴赫猜想5860007使用函数输出整数的逆序数5960009统计单词6060062简单计算器61第2周(M2)20011求华氏温度100°F对应的摄氏温度。

C语言编程题(带答案)

C语言编程题(带答案)
22、一个皮球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求当它第10次落地时,共经过了多少米,第10次反弹多高?
23、输出所有0-200之间能被3整除且个位数字为6的整数。
24、输入一个正整数,输出它的阶乘。
25、编写程序,判断从键盘输入的字符中数字字符的个数、大写字母的个数、小写字母的个数及其它字符的个数,以*作为字符输入结束标志。
sum=sum+i;
printf("%d\n",sum);
}
4、从键盘输入10个数,统计非负数的个数,并计算非负数的和。
#include
void main()
{ int i,n=0,sum=0;
int a[10];
printf(“请输入10个数:”);
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
if(max
void main()
{
int i;
for(i=200;i<=400;i++)
if((i%3==0)&&((i-6)%10==0))
printf("%d\n",i);
printf("\n");
}
16、编写程序,将用户输入的字符串中所有的字符a去掉,然后输出剩余的字符。
#include
void main()
#include
void main()
{ int i,sum=0;
for(i=200;i<=400;i++)
if(i%7!=0)
sum=sum+i;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最少硬币问题【问题描述】有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱;各面值的个数存在数组Coins[1:n]中。

【编程任务】对于给定的1<=n<=10,硬币面值数组、各面值的个数及钱数m,0<=m<=2001,编程计算找钱m的最少硬币数。

input : 第一个数字n,后面n行每行两个数,面值T[i],面值个数Num[i];最后是钱数m。

output:最少硬币数。

Sample intput :31 32 35 318Sample output:5陷阱提示:表面上看该题用贪心算法比较合适,确实如此,但是仅用用贪心算法可能导致无解(事实上有解),用动态规划方法来做,可以,但浪费时间和空间,一种基于动态规划思想的贪心算法可以很好地解决此类问题。

m[i][j] 表示一第i种面值的硬币为最大币,j表示为要找的零钱数,首先判断j>i 或 j>T[i] ,在 j>i 或 j>T[i]的情况下求int X=j/T[i];X=min(X,Coins[i]);动态方程:m[i][j]=min{X+m[i-1][j-T[I]*X],X-1+m[i-1][j-(X-1)*T[i]]}; 详细代码如下:// LeastCoins.h#ifndef LEASTCOINS_H#define LEASTCOINS_Hclass LeastCoins{public:LeastCoins();~LeastCoins();void run();private:int number; // 不同面值的硬币个数int TotalMoney; // 要找回的总钱数int *T; // 存储硬币的面值int *Coins; // 硬币的个数int **m; // m[i][j] 是以最大面值 i 要找回钱数是 j 需要硬币数的最少个数bool input();int changeMoney(int i,int j); // i 是第 i 中硬币void output();void traceback(); // 寻找轨迹};#endif// LeastCoins.cpp#include <iostream.h>#include <fstream.h>#include <cstdlib>#include <iomanip.h>#include "LeastCoins.h"#define N 10 // 根据实际问题规模的大小来初始化ifstream inputFile("input.txt",ios::out);ofstream outputFile("output.txt",ios::out);LeastCoins::LeastCoins(){number=0;TotalMoney=0;T=new int [N];Coins=new int [N];m=new int *[N];for (int i=0;i<N;i++){m[i]=new int [N*N];}}LeastCoins::~LeastCoins(){delete []T;delete []Coins;for (int i=0;i<N;i++){delete []m[i];}delete []m;}void LeastCoins::run(){if (input()){changeMoney(number,TotalMoney);output();}}bool LeastCoins::input(){inputFile>>number;outputFile<<"有 "<<number<<" 不同的硬币."<<endl;outputFile<<setw(4)<<"面值"<<setw(7)<<"个数"<<endl;int sum=0;for (int i=1;i<=number;i++){inputFile>>T[i];inputFile>>Coins[i];outputFile<<setw(3)<<T[i]<<setw(3)<<" "<<setw(3)<<Coins[i]<<endl;sum+=T[i]*Coins[i];}inputFile>>TotalMoney;outputFile<<"需要找回的总钱数为: "<<TotalMoney<<endl;if (T!=NULL && Coins!=NULL){if (sum>=TotalMoney){return true;}else{outputFile<<"所有硬币的总钱数是"<<sum<<" 小于需要找回的总钱数"<<TotalMoney<<endl;}return false;}return false;}int LeastCoins::changeMoney(int i,int j){if (i>1){if (j<T[i]) // 要找的钱数小于该硬币的面值{m[i-1][j]=changeMoney(i-1,j);m[i][j]=m[i-1][j];return m[i][j];}else{int X=j/T[i]; // 最多需要面值为 T[i] 的硬币的个数X=(X<Coins[i] ? X : Coins[i]) ; // 取 X 和 Coins[i]的较小值int T1=changeMoney(i-1,j-X*T[i]);int T2=changeMoney(i-1,j-(X-1)*T[i]);m[i-1][j-X*T[i]]=T1;m[i-1][j-(X-1)*T[i]]=T2;if ((T1+X)>(T2+X-1)){m[i][j]=T2+X-1; // 取小}else{m[i][j]=T1+X;}return m[i][j];}}else if(i==1)// 此时 i==1{if ((j%T[1])==0 && (j/T[1]<=Coins[1])){m[1][j]=j/T[1];return m[1][j];}else{return 1000000; // 只要能保证不被选中就行}}else{return 1000000;}}void LeastCoins::output(){if (m[number][TotalMoney]<1000000) // 判断是否有解{outputFile<<"需要最少的硬币个数是: "<<m[number][TotalMoney]<<endl;outputFile<<setw(4)<<"面值"<<setw(7)<<"个数"<<endl;traceback();}else{outputFile<<"无解"<<endl;}}void LeastCoins::traceback(){int j=TotalMoney;for (int i=number;i>=2;i--){int X=j/T[i]; // 最多需要面值为 T[i] 的硬币的个数X=(X<Coins[i] ? X : Coins[i]) ; // 取 X 和 Coins[i]的较小值int T1=m[i-1][j-X*T[i]]+X;int T2=m[i-1][j-(X-1)*T[i]]+X-1;if (T1<T2){outputFile<<setw(3)<<T[i]<<setw(3)<<" "<<setw(3)<<X<<endl;j-=X*T[i];}else{outputFile<<setw(3)<<T[i]<<setw(3)<<" "<<setw(3)<<(X-1)<<endl;j-=(X-1)*T[i];}}outputFile<<setw(3)<<T[i]<<setw(3)<<" "<<setw(3)<<(j/T[1])<<endl;}// main.cpp#include "LeastCoins.h"int main(){LeastCoins LC;LC.run();return 0;}。

相关文档
最新文档