贪心算法实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档