【算法实验】实验六

实验6-1 硬币找钱问题—贪心

问题描述:

  设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2 元。现要用这些面值的硬币来购物和找钱。购物时可以使用的各种面值的硬币个数存于数组Coins[1:6 ]中,商店里各面值的硬币有足够多。在1 次购物中希望使用最少硬币个数。

  例如,1 次购物需要付款0.55 元,没有5 角的硬币,只好用2*20+10+5 共4 枚硬币来付款。如果付出1 元,找回4 角5 分,同样需要4 枚硬币。但是如果付出1.05 元(1 枚1 元和1 枚5 分),找回5 角,只需要3 枚硬币。这个方案用的硬币个数最少。

编程任务:

  对于给定的各种面值的硬币个数和付款金额,编程计算使用硬币个数最少的交易方案。

数据输入:

由文件input.txt 给出输入数据。每一行有6 个整数和1 个有2 位小数的实数。分别表示

可以使用的各种面值的硬币个数和付款金额。文件以6 个0 结束。

结果输出:

  将编程计算出的最少硬币个数输出到文件output.txt 。结果应分行输出,每行一个数据。如果不可能完成交易,则输出”impossible”。

输入文件示例

input.txt

2 4 2 2 1 0   0.95

2 4 2 0 1 0   0.55

0 0 0 0 0 0

输出文件示例

output.txt

2

3


#include<bits/stdc++.h> 
const int N = 20000 ;
int ch[N]; 
int dp[N]; // dp[i]为当前拥有的硬币数量条件下表示面值为i的最少硬币个数
int v[ 6 ] = { 1 , 2 , 4 , 10 , 20 , 40 }; // 每种硬币对应面值,依次为1,2,4,10,20,40个五分,即5,10,20,50,100,200;
int nm[ 6 ]; // 对应于当前拥有的每种硬币个数
void init() // 计算ch[i]
{
	int i,j;
	for (i = 0 ;i < N;i ++ )ch[i] =- 1 ;
	ch[ 0 ] = 0 ;
	for (i = 0 ;i < 6 ;i ++ )
	{
		for (j = v[i];j < N;j ++ ) 
		{
			if (ch[j - v[i]] !=- 1 )
			{
				int temp = ch[j - v[i]] + 1 ;
				if (ch[j] ==- 1 || temp < ch[j])ch[j] = temp;
			}
		}
	}
}
int main()
{
	init(); 

	while (scanf( " %d%d%d%d%d%d " , & nm[ 0 ], & nm[ 1 ], & nm[ 2 ], & nm[ 3 ], & nm[ 4 ], & nm[ 5 ]) != EOF)
	{
		int sum = 0 ;
		int kk;
		for (kk = 0 ;kk < 6 ;kk ++ )sum += nm[kk];
		if (sum == 0 ) break ;
		double weight;
		scanf( " %lf " , & weight);
		weight = weight * 100 ;
		int w = int (weight + 0.0000001 ); 	
		if (w % 5 != 0 ) 
		{
			printf( " impossible\n " );
			continue ;
		}
		else
			w = w / 5 ;
		int i,j;
		memset(dp, - 1 , sizeof (dp));
		dp[ 0 ] = 0 ;
		int bigger = 0 ;
		for (i = 0 ;i < 6 ;i ++ )//计算顾客支付面值i需要的最少硬币数dp[i]
		{
			while (nm[i] -- ) 
			{
				bigger = bigger + v[i];
				for (j = bigger;j >= v[i];j -- )
				{
					if (dp[j - v[i]] !=- 1 )
					{
						int temp = dp[j - v[i]] + 1 ;
						if (dp[j] ==- 1 || temp < dp[j])
						{
							dp[j] = temp;
						}
					}
				}	
			}
		}
		int ans =- 1 ;
		for (i = w;i <= bigger;i ++ )//寻找最少硬币组合
		{
			if (dp[i] !=- 1 )
			{
				int need = i - w;
				if (ch[need] !=- 1 )
				{
					int temp = dp[i] + ch[need];
					if (ans ==- 1 || ans > temp)ans = temp;
				}
			}
		}
		if (ans !=- 1 )
			printf( " %d\n " ,ans);
		else
			printf( " impossible\n " );
	}
	return 0 ;
}

解决思路:

首先,我们要明确一下贪心算法的思想:每次尽可能选取面值最大的硬币,直到无法选取为止。这样可以保证找钱的硬币数量最少。

根据这个思想,我们可以先对硬币的面值按照从大到小的顺序进行排列,即2元、1元、5角、2角、1角和5分。然后,对于需要找的钱数,

我们从大到小依次考虑每种面值的硬币,先使用尽可能多的最大面值硬币,然后再考虑次大面值硬币,以此类推,直到钱数为0为止。

具体的步骤如下

1.对硬币面值进行排序,顺序为2元,1元,5角,2角,1角,5分]。

2.对于需要找的钱数,从大到小依次考虑每种面值的硬币。

3.对于每种面值的硬币,先使用尽可能多的最大面值硬币,直到这种面值的硬币用完或者钱数不足该面值硬币的数量。

4.如果该种面值的硬币用完了,就考虑下一种面值的硬币。

5.重复以上步骤,直到钱数为0为止。

需要注意的是,在使用每种面值的硬币时,我们需要判断当前购物时可用的该种面值硬币数量是否足够,如果不够,则需要向下一种面值

的硬币继续考虑。

在实际操作中,我们可以设计一个循环,每次选择当前最大面值的硬币,然后扁历整个硬币数组,依次从当前最大面值的硬币个数到0

个,尝试找到一种可行的方案。如果可以找到一种方案,就更新钱数和对应的硬币数量。如果遍历完整个硬币数组仍然无法找到方案,则

说明无法完成找钱操作。

 

实验6-2 会场安排问题

问题描述:

  假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的 。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)

编程任务:

  对于给定的k 个待安排的活动,编程计算使用最少会场的时间表。

数据输入:

  由文件input.txt 给出输入数据。第一行有1 个正整数k,表示有k 个待安排的活动。接下来的k 行中,每行有2 个正整数,分别表示k 个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。

结果输出:

  将编程计算出的最少会场数输出到文件output.txt 。

输入文件示例输出文件示例

input.txt                       output.txt

5                             3

1 23

12 28

25 35

27 80

36 50

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1e4 + 5;
int n, a[N], b[N], ans;

int main() {
    // 打开输入文件
    freopen("input.txt", "r", stdin);
    // 从文件读取输入
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) 
        scanf("%d%d", &a[i], &b[i]);

    sort(a, a + n);
    sort(b, b + n);

    int j = 0;
    ans = 0;
    for(int i = 0; i < n; ++i) {
        if(a[i] < b[j]) ans++;
        else j++;
    }

    // 打开输出文件
    freopen("output.txt", "w", stdout);
    // 向文件写入输出
    printf("%d", ans);

    // 关闭文件
    fclose(stdin);
    fclose(stdout);

    return 0;
}

算法具体描述:

1)用数组s和f分别存储各活动的开始时间和结束时间,将s按非递减排序,该次序为各活动选择会场的次序;将f按非递减排序, 由于会场的结束时间由活动的结束时间决定,排序后的数组也是会场的结束时间点。

2)先为最早开始的活动开辟一个会场,此时会场的最早结束时间为该活动的结束时间,然后遍历剩下的活动,对于每个活动,判断当前最早结束的会场内是否仍有活动(即会场的最早结束时间大于该活动的开始时间),如果有,开辟一个新会场;如果没有,说明当前最早结束的会场能容纳当前的活动,更新会场的结束时间点,保证最早结束的会场最先开始下一个活动。

举例

设有4个活动,每个活动的开始和结束时间分别为{1, 6}, {4, 8}, {9, 10}, {7, 18}

实验6-3 文件压缩(Huffman Tree)

【问题描述】给定一个文件,文件由n个字符组成,但他们出现的频度不相同。要求对该文件中的字符集构造哈夫曼树,并计算编码后的文件长度。 【输入形式】

输入的第1行有1个数字n,表示文件中总的字符个数。接下来1行中有n个数字,分别表示n个字符出现的频度。 【输出形式】

输出1行包含1个数字,表示使用哈夫曼编码后该文件的长度。 【样例输入】

5

20 7 10 4 18 【样例输出】

129 【样例说明】

使用哈夫曼编码后,各字符的编码长度分别为2 3 2 3 2,文件长度为220+37+210+34+2*18=129

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans;
int num[100100];
priority_queue<int>q;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		int x;
		scanf("%d",&x);
		q.push(-x);
	}
	while(q.size()>1)
	{
		int cur=q.top();
		q.pop();
		int cur2=q.top();
		q.pop();
		int sum=cur+cur2;
		q.push(sum);
		ans+=-sum;
	}
	printf("%d",ans);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/336107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CHS_01.2.2.1+调度的概念、层次

CHS_01.2.2.1调度的概念、层次 调度的概念、层次知识总览调度的基本概念调度的三个层次——高级调度![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6957fdec179841f69a0508914145da36.png)调度的三个层次——低级调度调度的三个层次——中级调度补充知识&#xff…

Wheeltec小车的开发实录(1)

sudo mount -t nfs 192.168.58.101:/home/wheeltec/wheeltec_robot /mnt 报错 mount: /mnt: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program. 解决办法 主机和从机都要安装 nfs-utils 安装nfs-utils su…

Android Termux技能大揭秘:安装MySQL并实现公网远程连接

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 安装MariaDB二. 安装cpolar内网穿透工具三. 创建安全隧道映射mysql四. 公网…

25计算机考研408专业课复习计划

点击蓝字&#xff0c;关注我们 今天要分享的是25计算机考研408专业课复习计划。 以下内容供大家参考&#xff0c;大家要根据自己的复习情况进行适当调整。 统考与自命题 统考科目是指计算机学科专业基础综合&#xff08;408&#xff09;&#xff0c;满分150分&#xff0c;试…

tomcat原理模拟和tomcat优化

1、tomcat实现原理 servlet 没有主方法main&#xff0c;依赖tomcat才能运行&#xff0c;因为tomcat 有主方法main&#xff0c;由java编写 servlet中doGet和doPost方法属于非静态方法&#xff0c;只能依托new对象存在&#xff0c;tomcat无法new出来对象&#xff0c;因此tomcat…

NLP论文阅读记录 - 2021 | WOS 使用预训练的序列到序列模型进行土耳其语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1 预训练的序列到序列模型2.2 抽象文本摘要 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结…

一文读懂JavaScript DOM节点操作(JavaScript DOM节点操作详解)

一、什么是节点 二、节点类型 1、元素节点 2、属性节点 3、文本节点 4、节点类型、名字、值表格 三、通过文档对象方法获取节点 1、通过id属性获取节点 2、通过标签名字获取节点 3、通过类名获取节点 4、通过name属性获取节点 四、通过层级关系获取节点 1、子节点 …

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…

从 Context 看 Go 设计模式:接口、封装和并发控制

文章目录 Context 的基本结构Context 的实现和传递机制为什么 Context 不直接传递指针案例&#xff1a;DataStore结论 在 Go 语言中&#xff0c; context 包是并发编程的核心&#xff0c;用于传递取消信号和请求范围的值。但其传值机制&#xff0c;特别是为什么不通过指针传递…

【大数据分析与挖掘技术】概述

目录 一、数据挖掘简介 &#xff08;一&#xff09;数据挖掘对象 &#xff08;二&#xff09;数据挖掘流程 &#xff08;三&#xff09;数据挖掘的分析方法 &#xff08;四&#xff09;经典算法 二、Mahout &#xff08;一&#xff09;Mahout简介 &#xff08;二&#…

CVE-2023-46226 Apache iotdb远程代码执行漏洞

项目介绍 Apache IoTDB 是针对时间序列数据收集、存储与分析一体化的数据管理引擎。它具有体量轻、性能高、易使用的特点&#xff0c;完美对接 Hadoop 与 Spark 生态&#xff0c;适用于工业物联网应用中海量时间序列数据高速写入和复杂分析查询的需求。 项目地址 https://io…

【INTEL(ALTERA)】F-tile 参考时钟和系统 PLL 时钟英特尔® FPGA IP无法锁定在特定频率?

说明 由于在英特尔 Quartus Prime Pro Edition 软件 22.2 及更早版本中存在一个问题&#xff0c;您可能会观察到 F-tile 参考时钟和系统 PLL 时钟英特尔 FPGA IP无法锁定&#xff1a; 999.9 MHz&#xff0c;参考时钟频率设置为 323.2 MHz。506.88 MHz&#xff0c;参考时钟频率…

Windows系统使用手册

点击前往查看&#x1f517;我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…

Ubuntu系统pycharm以及annaconda的安装配置笔记以及问题集锦(更新中)

Ubuntu 22.04系统pycharm以及annaconda的安装配置笔记以及问题集锦 pycharm安装 安装完之后桌面上并没有生成图标 后面每次启动pycharm都要到它的安装路径下的bin文件夹下&#xff0c; cd Downloads/pycharm-2018.1.4/bin然后使用sh命令启动脚本程序来打开pycharm sh pycha…

01 MyBatisPlus快速入门

1. MyBatis-Plus快速入门 版本 3.5.31并非另起炉灶 , 而是MyBatis的增强 , 使用之前依然要导入MyBatis的依赖 , 且之前MyBatis的所有功能依然可以使用.局限性是仅限于单表操作, 对于多表仍需要手写 项目结构&#xff1a; 先导入依赖&#xff0c;比之前多了一个mybatis-plus…

动态规划汇总

作者推荐 视频算法专题 简介 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程。每次决策依赖于当前状态&#xff0c;又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的&#x…

《WebKit 技术内幕》之五(2): HTML解释器和DOM 模型

2.HTML 解释器 2.1 解释过程 HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。 这一过程中&#xff0c;WebKit 内部对网页内容在各个阶段的结构表示。 WebKit 中这一过程如下&#xff1a;首先是字节流&#xff0c;经过解码之…

力扣每日一练(24-1-20)

大脑里的第一想法是排列组合&#xff0c;直接给出超级准确的最优解。 但不适用&#xff0c;hhh 只要连续的n个元素大于或者等于target就可以了 题目比自己想象的要好解决 解法是使用滑动窗口算法。这个算法的基本思想是维护一个窗口&#xff0c;使得窗口内的元素总和大于等于目…

消除游戏(寒假每日一题+模拟、优化)

题目 在一个字符串 S 中&#xff0c;如果 SiSi−1 且 Si≠Si1&#xff0c;则称 Si和 Si1 为边缘字符。 如果 Si≠Si−1 且 SiSi1&#xff0c;则 Si−1 和 Si 也称为边缘字符。 其它的字符都不是边缘字符。 对于一个给定的串 S&#xff0c;一次操作可以一次性删除该串中的所…

【c++笔记】用c++解决一系列质数问题!

质数是c语言和c中比较常见的数学问题&#xff0c;本篇文章将带你走进有关质数的一系列基础问题&#xff0c;其中包含常见的思路总结&#xff0c;本篇文章过后&#xff0c;将会持续更新c算法系列&#xff0c;感兴趣的话麻烦点个关注吧&#xff01; 希望能给您带来帮助&#xff…
最新文章