首页 > 其他分享 >最少硬币问题(c语言实现)

最少硬币问题(c语言实现)

时间:2023-06-20 10:38:45浏览次数:38  
标签:语言 nn 硬币 int Coins ++ 最少 fpr


1.1题目
算法实现题3-2 最少硬币问题
★问题描述:设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中,现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组 Coins[l:n]中。
对任意钱数0≤m≤20 001,设计一个用最少硬币找钱m的方法。
★算法设计:对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组 Coins,以及钱数m,0≤m≤20 001,计算找钱m的最少硬币数。
★数据输入:由文件 Input.txt提供输入数据,文件的第1行中只有1个整数给出n的值,第2行起每行2个数,分别是T[i]和 Coins[j]。最后1行是要找的钱数m。
★结果输出:将计算出的最少硬币数输出到文件 output.txt,问题无解时输出-1。
输入文件示例 输出文件示例
input.txt output. txt
3 5
1 3
2 3
5 3
1 8
1.2分析
因为之前的程序使用了贪心算法,导致更换数据后极有可能误将局部最优解当成全局最优解输出,为保证结果的正确性,改用遍历算法,使用goto语句循环遍历所有可能性。
1.3源代码

#include <iostream>
#include<stdio.h>
void sort(int* p, int* q, int n);
int main()
{
	FILE* fpr, * fpw;
	fopen_s(&fpr, "input.txt","r");
	fopen_s(&fpw, "output.txt", "w");
	int i, j, m, n = 0, s, max, y, nn, z, f = 0, min, k;
	int T[10], Coins[10],b[1000];
	fscanf_s(fpr, "%d", &nn);
	j = z = 0;
	for (i = 0; i < 2 * nn; i++)
	{
		if (i % 2 == 0)
		{
			fscanf_s(fpr, "%d", T + j);//遇到空格或换行自动暂停读
			j++;
		}
		if (i % 2 == 1)
		{
			fscanf_s(fpr, "%d", Coins + z);
			z++;
		}
	}
	fscanf_s(fpr, "%d", &m);
	s = nn;
	printf("共有%d种硬币\n", s);//调试用
	sort(T, Coins, s);
	y = m;
	s -= 1;
aa:	for (i = nn - 1; (i >= 0) && (y != 0); i--)//余数匹配
	{
		for (j = 0; (y >= T[i]) && (j < Coins[i]); j++)
		{
			y -= T[i];
			n += 1;
		}
	}
		if (y == 0)
			b[f++] = n;
		n = 0;
		y = m;
		s -= 1;
		k = T[nn-1];
		T[nn-1] = T[s];
		T[s] = k;
		k = Coins[nn - 1];
		Coins[nn - 1] = Coins[s];
		Coins[s] = k;
		while (s != 0)
			goto aa;
	min = b[0];
	for (i = 0; i < f; i++)
		if (b[i] < min)
			min = b[i];
	printf("总方案数为:%d", min);//调试用
	fprintf(fpw, "%d\n", min);
	fclose(fpr);
	fclose(fpw);
	return 0;
}
void sort(int* p, int* q, int n)//冒泡排序
{
	int i, j, temp;
	for (i = 0; i < n-1; i++)
		for (j = i + 1; j < n; j++)
			if (p[i] > p[j])
			{
				temp = p[i];
				p[i] = p[j];
				p[j] = temp;
				temp = q[i];
				q[i] = q[j];
				q[j] = temp;
			}
}

1.4运行结果

最少硬币问题(c语言实现)_数组


1.5总结

编程完成后应使用大量结果或特殊情况进行验证,以防边界值出现错误。

在文件的数据较为复杂时,不能熟练掌握对文件的操作,继续加油!


标签:语言,nn,硬币,int,Coins,++,最少,fpr
From: https://blog.51cto.com/u_16165815/6520878

相关文章

  • 数列极差问题(c语言实现)
    4.1题目算法实现题4-13数列极差问题★问题描述:在黑板上写了N个正数组成的一个数列,进行如下操作:每一次擦去其中2个数,设为a和b,然后在数列中加入一个数ab+1,如此下去直至黑板上只剩下一个数。在所有按这种操作方式最后得到的数中,最大的数记为max,最小的数记为min,则该数列的极差M定义......
  • 从零开始学Python第04课:Python语言元素之运算符
    Python语言支持很多种运算符,下面的表格按照运算符的优先级从高到低,对Python中的运算符进行了罗列。有了变量和运算符,我们就可以构造各种各样的表达式来解决实际问题。在计算机科学中,表达式是计算机程序中的句法实体,它由一个或多个常量、变量、函数和运算符组合而成,编程语言可以......
  • 从零开始学Python第03课:Python语言中的变量
    对于想学习编程的新手来说,有两个问题可能是他们很想知道的,其一是“什么是(计算机)程序”,其二是“写(计算机)程序能做什么”。先说说我对这两个问题的理解:程序是数据和指令的有序集合,写程序就是用数据和指令控制计算机做我们想让它做的事情。今时今日,为什么有那么多人选择用Python语言......
  • 【技术积累】自然语言处理中的基础知识【二】
    什么是语言模型概念语言模型是一种自然语言处理技术,用于评估一个句子或句子序列在语言中的概率。它基于统计语言学,尝试建立单词序列的概率分布模型,使该模型能够生成未见过的句子。语言模型是机器翻译、语音识别、自动摘要、对话系统等自然语言处理任务的关键组成部分。语言模型......
  • Python和c语言爬虫如何选择?
    Python是最受欢迎的爬虫语言之一,因为它易于学习和使用,有大量的库和框架可供选择。JavaScript通常用于Web爬虫,因为它可以直接在浏览器中运行,可以轻松地从动态网站中提取数据。java是一种广泛使用的语言,它有很多强大的库和框架,可以用于爬虫。具体用哪个语言做爬虫完全取决于你的项目......
  • Go语言中的原子操作
    1.引言在并发编程中,多个协程同时访问和修改共享数据时,如果没有使用适当的机制来防止并发问题,这个时候可能导致不确定的结果、数据不一致性、逻辑错误等严重后果。而原子操作是解决并发编程中共享数据访问问题的一种常见机制。因此接下来的文章内容将深入介绍原子操作的原理、......
  • 自然语言处理 Paddle NLP - 信息抽取技术及应用
    1.什么是信息抽取即自动从无结构或半结构的文本中抽取出结构化信息的任务(病历抽取)2.实体抽取3.关系抽取4.事件抽取信息抽取和知识图谱是一个上下游的关系。抽取的结果,可以组装成知识图谱(一种存储知识的结构)医疗、金融、法律,三大行业用得比较多从问诊中抽取信息贷款......
  • R语言改进的DCC-MGARCH:动态条件相关系数模型、BP检验分析股市数据
    全文链接:http://tecdat.cn/?p=32818原文出处:拓端数据部落公众号股票市场波动性模型一直是金融领域研究的热点之一。传统的波动性模型往往只考虑了静态条件下的波动性和相关性,难以准确捕捉市场的复杂性和多样性。因此,本文提出了一种基于R语言改进的DCC-MGARCH模型,帮助客户探究动......
  • R语言用CPV模型的房地产信贷信用风险的度量和预测|附代码数据
    全文链接:http://tecdat.cn/?p=30401最近我们被客户要求撰写关于CPV模型的研究报告,包括一些图形和统计输出。本文基于CPV模型,对房地产信贷风险进行了度量与预测。我们被客户要求撰写关于CPV模型的研究报告结果表明,该模型在度量和预测房地产信贷违约率方面具有较好的效果。......
  • R语言如何用潜类别混合效应模型(LCMM)分析抑郁症状|附代码数据
    全文下载链接:http://tecdat.cn/?p=22206最近我们被客户要求撰写关于潜类别混合效应模型(LCMM)的研究报告,包括一些图形和统计输出。每一个动态现象都可以用一个潜过程(Λ(t)来描述,这个潜过程在连续的时间t内演化。模型背景当对重复测量的标志变量进行建模时,我们通常不会把它看成......