贪心算法.docx
《贪心算法.docx》由会员分享,可在线阅读,更多相关《贪心算法.docx(23页珍藏版)》请在冰豆网上搜索。
贪心算法
福建工程学院计算机与信息科学系
实验报告
2011–2012学年第二学期任课老师:
章静
课程名称
结构化程序设计
班级
学号
姓名
实验题目
贪心算法设计技术的应用
实验时间
实验开始日期:
报告提交日期:
2012/4/27
实验目的、要求
实验题目
1.利用贪心策略解决背包问题。
现有载重为M公斤的背包和n种货物。
第i种货物的重量为Wi,它的总价值为Pi,假定M、Wi、Pi均为整数。
设计程序给出装货方法,使装入背包的货物总价值达到最大。
2.设计实现超市收银程序,假设顾客在超市购买各种商品,来到收银台结账,收银员具有面值为100,20,10,5和1元的纸币和各种面值为5角、2角、1角的硬币。
设计程序计算顾客各种所买商品的钱数,并根据顾客所付的钱数输出零钱的数目及要找的各种货币的数目。
实验要求
1.该实验的课内学时是4个课时。
2.题目1必须完成。
3.题目1在完成上述基本功能的前提下,有能力的同学可以完成题目2。
实验步骤与内容
按如下顺序写:
1、主要设计思想;
背包和收银程序的算法思想都是遵循贪心算法的思想
像背包这题,我是将货物信息存入链表,并将它的货物性价比求出来,并进行从大到小的排序,若货物可分割,并从性价比最高的开始装入,直至到某个货物装入超出背包限额时,进行分割,若货物不可分割,则从性价比最高的选择装入,若是装入后总质量超过背包限额的,则不装入背包,选择下个货物,直至到达最大容量.,当然这些还有个前提,若是货物的`总重量小于背包承载量是,则显示货物全部装入.
收银这题的解法和背包的很像,也是建立链表,将零钱面值从大到小依次存入链表,然后,根据顾客给的钱数和所花的费用,求出需找钱的总额,然后从链表头部(最大面值)开始选择找钱,当该结点面额的张数小于需找钱数时,所找钱数减去该面额,判断该面额是否还小于需找钱数,若是,继续,否则选择找下一个面额的零钱,直至最小的0.1元为止.于是找钱完毕了.
2、主要数据结构及其解释
背包:
typedefstructnode
{
intno;//货物编号
intweight;//货物重量
intvalue;//货物总价值
floatper;//货物性价比
structnode*next;//指针
}Linklist;
Linklist*Initlist(Linklist*L)
{
L=(Linklist*)malloc(sizeof(Linklist));
L->next=NULL;
returnL;
}
找钱:
typedefstructnode
{
Floatdata;//存放硬币面值
structnode*next;
}Linklist;
Linklist*Initlist(Linklist*L)
{
L=(Linklist*)malloc(sizeof(Linklist));
L->next=NULL;
returnL;
}
3、模块关系图;
背包:
找钱:
4、所有函数的简要说明;
背包:
1).创建货物链表
2)链表按性价比排序(插入排序)
2)menu函数(显示各个信息)
显示货物清单,背包容量,物品的可分割行等信息,,让用户更加一目了然.
3)主函数
找钱:
1)创建关于硬币面值的链表
根据题意,链表生成8个结点,依次从大到小在其数据域里存入各零钱的面值为
2)主函数
5、所有源代码;
附表后
试验过程记录
记录试验中遇到的困难及解决方法;
背包:
一开始在逻辑上有些不太全面,像分割与不可分割,能全部装载(货物总重量小于背包限额)和不能全部装载
找钱:
一开始没有考虑到顾客付的钱是否大于他应付的钱,后面稍微做完善了下,还有一个大问题,就是一开始的时候,找钱总会有一毛钱的误差.然后发现这是用到浮点数就会有这个误差存在,然后再所求得的结果上加上一个0.01就解决问题了.
实验结果记录以及与预期结果比较以及分析
记录每次实验结果以及分析情况
背包:
1)不可以分割
a)货物总重量小于背包容量
b)货物总重量大于背包容量
C)货物重量均大于背包限额
2)货物可分割
找钱:
总结以及心得体会
这次背包实验耗费时间不多,思路比较清晰,一步一步写下来,逻辑没什么错误,纠正一下小错误像链表方面的,就没什么了,还有一个工作就是初步做完之后的界面完善和逻辑的完善,添加一些其他没考虑到的结果想背包里面货物总重量小于背包负载量,则直接装载,.倒是找钱问题我纠结了挺久,,怎么就会出错呢,幸好最后还是找到了解决的方法.
不过说实话,经过一段时间的训练,更加喜欢使用链表,总感觉它控制各循环会更加简洁,也更加方便
指导老师评阅意见
指导老师:
年月日
填写内容时,可把表格扩大。
实验的源程序代码(要有注释)附在表后。
背包:
#include
#include
typedefstructnode
{
intno;
intweight;
intvalue;
floatper;
structnode*next;
}Linklist;
Linklist*Initlist(Linklist*L)
{
L=(Linklist*)malloc(sizeof(Linklist));
L->next=NULL;
returnL;
}
Linklist*Creatlist(Linklist*L,intNum)
{
Linklist*r=L,*p;intk=Num;
while(k)
{
p=(Linklist*)malloc(sizeof(Linklist));
p->next=NULL;
printf("请输入第%d个货物信息1.重量:
",Num-k+1);
scanf("%d",&p->weight);
printf("2.价值:
");
scanf("%d",&p->value);
p->per=(float)p->value/p->weight;
p->no=Num-k+1;
r->next=p;
r=r->next;
k--;
}
returnL;
}
Linklist*order(Linklist*L)
{
system("cls");
Linklist*head,*head1,*p,*inser,*newL;
newL=(Linklist*)malloc(sizeof(Linklist));/*存在空的头结点并分配空间*/
newL->next=NULL;
head=L->next;
while(head)
{
p=(Linklist*)malloc(sizeof(Linklist));
p->value=head->value;
p->weight=head->weight;
p->per=head->per;
p->no=head->no;
head1=newL;//从头开始寻找插入位置
if(head1->next==NULL)//新表头为空,则直接插入
{
head1->next=p;
p->next=NULL;
}
else
{
inser=head1->next;
while(inser)//寻找插入位置
{
if(inser->per>p->per)
{
head1=inser;
inser=inser->next;
}
else
break;
}
if(inser==NULL)//插入的位置是否在尾部
{
head1->next=p;
p->next=NULL;
}
else
{
head1->next=p;
p->next=inser;
}
}
head=head->next;
}
returnnewL;
}
voidmenu(Linklist*L,inttotal,ints)
{
Linklist*p=L->next;
inti=1;
printf("货物清单:
\n\n");
printf("货物编号货物重量(斤)货物总价值(元)货物性价比\n");
while(p)
{
printf("%8d%12d%23d%20.3f\n\n",p->no,p->weight,p->value,p->per);
p=p->next;
}
printf("背包总容量:
%d\n\n",total);
if(s)
printf("货物:
可分割\n");
else
printf("货物:
不可分割\n");
printf("----------------------------------------------------------------------------\n");
printf("============================================================================\n");
printf("----------------------------------------------------------------------------\n\n");
}
intmain()
{
while
(1){
inttotal,s,Num,loading=0;
floatbagvalue=0;
printf("请输入背包总容量:
\n");
scanf("%d",&total);
printf("请输入需运送的货物总数:
\n");
scanf("%d",&Num);
printf("请问货物可不可以分割,可以--1,不可以--0:
\n");
scanf("%d",&s);
Linklist*L=Initlis(L),*p;
L=Creatlist(L,Num);
L=order(L);
p=L->next;
intsum,tvalue=0;Linklist*w=L->next;
while(w)
{
sum=sum+w->weight;
tvalue=tvalue+w->value;
w=w->next;
}
getchar();
if(s)
{
if(total{
menu(L,total,s);
while(loading+p->weight{
loading=loading+p->weight;
printf("装入第%d类货物%d斤,价值为%.2f\n\n",p->no,p->weight,p->weight*p->per);
bagvalue+=p->weight*p->per;
p=p->next;
}
printf("装入第%d类货物%d斤,价值为%.2f\n\n",p->no,total-loading,(total-loading)*p->per);
bagvalue+=