贪心算法实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中原工学院信息商务学院
算法设计与分析
实验报告
系别:计算机科学系
专业:网络工程
班级:网络132
学号: 201301024225
学生姓名:齐冬生
指导教师:邬迎
2014年11月24日
实验三贪心算法的应用
一、实验目的
1.掌握贪心算法的基本概念和两个基本要素
2.熟练掌握贪心算法解决问题的基本步骤。
3.学会利用贪心算法解决实际问题。
二、实验内容
1.问题描述:
题目一:找钱问题
一个顾客买了价值x元的商品(不考虑角、分),并将y元的钱交给售货员。售货员希望用张数最少的钱币找给顾客。
要求:键盘输入x与y
输出找钱总数,各种钱币的张数,若张数为0不必输出。
题目三:分数表示问题
设计一个算法,把一个真分数表示为最少埃及分数之和的形式。所谓埃及分数是指分子为1的分数。如7/8=1/2+1/3+1/24。
三.算法设计
数据结构与核心算法的设计描述,函数调用及主函数设计主要算法流程图等.
题目一:1)为了能达到找钱的张数最少,用贪婪的思想,先尽量多地取大面额的币种,由大面额到小面额币种逐渐统计。
2)为了能构造出循环不变式,利用数组应用技巧,将币值存储在数组中,为了能实现贪婪策略,币值应该从大面额的币种到小面额的币种依次存储。
3)算法需要统计面额的数量,同样利用数组应用技巧,设置一个累加器数组,这样就可以通过循环顺利完成。
题目三:设某个真分数的分子为a,分母为b;把b除以a的商部分加1后的值作为埃及分数的某一个分母c;将a乘以c再减去b,作为新的a;将b乘以c,得到新的b;如果a大于1且能整除b,则最后一个分母为b/a;算法结束;或者,如果a等于1,则,最后一个分母为b;算法结束;否则重复上面的步骤。备注:事实上,后面判断a是否大于1和a是否等于1的两个判断可以合在一起,及判断b%a是否等于0,最后一个分母为b/a,显然是正确的。
四.程序调试及运行结果分析
题目一
题目三
五.实验总结
在贪心算法中,每次做出的选择仅在当前的状态下做出的最好的选择,即局部最优选择。然后再去解做出这个选择后产生的相应的子问题。不是每个问题用贪心算法都可以一定得到最优解,除非该问题具有贪心选择性质(所求问题的整体最优解可以通过一系列局部最优的选择而得到)和最优子结构性质。
此次实验让我对贪心算法的思想有了初步的了解,并且学会了用贪心算法解决一些实际问题。两个程序中都运用了循环语句和数组技巧,在编写代码时,在循环语句的设置中遇到许多问题,经过调试最终解决。所以,以后应当多做一些循环语句的练习,通过实践加强编程的熟练程度。
题目一
#include
int main()
{
int a,b,n,GZ,A,B[8]={0,100,50,20,10,5,2,1},S[8]={0,0,0,0,0,0,0,0}; printf("请输入物品的金额:");
scanf("%d",&a);
printf("请输入顾客给的钱数:");
scanf("%d",&b);
n=b-a;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=7;j++)
{
A=n/B[j];
S[j]=S[j]+A;
n=n-A*B[j];
}
}
for(i=1;i<=7;i++)
printf("%d元----%d张\n",B[i],S[i]); return 0;
}
题目三
#include
int main(void)
{
int a,b,c;
while(scanf("%d/%d",&a,&b)!=EOF)
{
// printf("%d/%d=",a,b);
while(a!=1)
{
c = b/a+1;
a = a*c-b;
b = b*c;
printf("1/%d + ",c);
//if(a>1)
//printf("");
if( (b % a == 0) || (a==1) ) {
printf("1/%d",b/a);
a = 1;
}
}
printf("\n");
}
return 0;
}