贪心算法实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三贪心算法的应用 (1)
一、实验目的 (1)
二、实验内容 (1)
三、实验步骤 (2)
实验三贪心算法的应用
一、实验目的
1.掌握贪心算法的基本概念和两个基本要素
2.熟练掌握贪心算法解决问题的基本步骤。
3.学会利用贪心算法解决实际问题。
二、实验内容
1.问题描述:
题目一:找钱问题
一个顾客买了价值x元的商品(不考虑角、分),并将y元的钱交给售货员。
售货员希望用张数最少的钱币找给顾客。
要求:键盘输入x与y
输出找钱总数,各种钱币的张数,若张数为0不必输出。
输入输出实例:
题目二:删数问题
键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出应包括所去掉的数字的位置和组成的新的正整数(N不超过100位)。
要求:键盘输入正整数N与删除位数s
输出删除后的最小新数以及删除的位数
输入输出实例:
题目三:分数表示问题
设计一个算法,把一个真分数表示为最少埃及分数之和的形式。
所谓埃及分数是指分子为1的分数。
如7/8=1/2+1/3+1/24。
三、实验步骤
1.理解算法思想和问题要求;
2.编程实现题目要求;
3.上机输入和调试自己所编的程序;
4.验证分析实验结果;
5.整理出实验报告
一.实验目的
二.问题描述
三.算法设计
包含:数据结构与核心算法的设计描述、函数调用及主函数设计、主要算法流程图等
对于高精度数的运算,应该讲输入的高精度数存储为字符串格式,根据输出要求设置数组,在删除数字是记录其位置。
在位数固定的前提下,让高位的数字尽量小,其值就较小,依据贪婪策略就可以解决这个问题。
另外,删除字符使用后面的字符覆盖已删除的字符的
方法,但字符串长度会改变,可能会有比较多字符移动操作,算法效率不高。
定义一个del 函数负责删除字符,不断调用del 函数以删除高位较大的数。
是
否
四.程序调试及运行结果分析
运行程序,输入一个正整数23146,输入要删除3个数字,然后成功运行程序后,输出删除后的最小数为14,删除的位数分别为2,1,5。
经过验证,最后得到的这个数确实为删除任意数的最小数。
Main 主函数
输入一个高精度数n 输入一个要删除几个数 S>len ? 输出“数据错误” 双重循环判断并调用del
函数删除字符 While 语句判断并清除 数字前面的0 输出结果n 删除位数data[i]
五.实验总结
通过本次实验我认识到自己对知识掌握不够全面以及编程能力的不足。
在使用循环语句进行相邻两个数比较,删除较大者时我一直没弄明白具体是怎样实现的。
而且依据书上的算法编写程序运行后结果并不正确。
后来在同学的帮助下才明白具体操作,改正了之前的错误。
由此也可以看出逻辑思维能力和基础知识也有所欠缺。
不过,经过前几次的实验,对于函数的相关操作我已经基本能够熟练的应用了。
附录:程序清单(程序过长,可附主要部分)
#include<iostream>
#include<string>
using namespace std;
void del(char n[],int b,int k)
{
int i;
for(i=b;i<=strlen(n)-k;i++)
n[i]=n[i+k];
}
void main()
{
char n[100];
int s,i,j,j1,data[100],len;
cout<<"请输入一个正整数: ";
cin>>n;
cout<<"你要删掉几个数字?"<<endl;
cin>>s;
len=strlen(n);
if(s>len)
{
cout<<"数据错误!"<<endl;
return;
}
j1=0;
for (i=1;i<=s ;i=i+1)
{
for (j=0;j<strlen(n);j=j+1)
if (n[j]>n[j+1]) //贪婪选择
{
del(n,j,1);
if (j>j1)
data[i]=j+i; //记录删除数字位置
else
data[i]=data[i-1]-1; //实例2向前删除的情况
j1=j; break;
}
if( j>strlen(n))
break;
}
for (i=i;i<=s;i++)
{
j=len-i+1;
del(n,j,1);
data[i]=j;
}
while (n[1]=='0' && strlen(n)>1)
del(n,1,1);
cout<<"删除后的数为:"<<n<<endl;
cout<<"删除的位数为:";
for (i=1;i<=s;i++)
cout<<data[i]<<" ";
cout<<endl;
}。