贪心算法设计.docx
- 文档编号:461567
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:16
- 大小:93.92KB
贪心算法设计.docx
《贪心算法设计.docx》由会员分享,可在线阅读,更多相关《贪心算法设计.docx(16页珍藏版)》请在冰豆网上搜索。
贪心算法设计
福建工程学院计算机与信息科学系
实验报告
2010–2011学年第一学期任课老师:
实验题目
贪心算法设计技术的应用
实验时间
实验开始日期:
报告提交日期:
实验目的、要求
一、实验题目
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)实验设计的数据结构
(1)数组
floatP[20],W[20],value[20],x[20];
(2)层次图
(3)各个函数分析
背包
voidpackbag()
{
inti,j,n,s=0;
floatP[20],W[20],value[20],x[20],values=0;
floatq=0,t=0,M=0;
printf("请输入货物的数目n:
\n");
scanf("%d",&n);
printf("请输入背包的负重M:
\n");
scanf("%f",&M);
printf("请输入各种货物的重量:
\n");
for(i=1;i<=n;i++)
scanf("%f",&W[i]);
printf("请输入各种货物的价值:
\n");
for(i=1;i<=n;i++)
scanf("%f",&P[i]);
for(i=1;i<=n;i++)
value[i]=P[i]/W[i];//计算货物的单位重量价值
for(i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++)
if(value[j] { t=value[j];value[j]=value[j+1];value[j+1]=t;//按货物的单位重量价值进行排序 q=W[j];W[j]=W[j+1];W[j+1]=q;//相应的货物重量进行排序 } } printf("单位价值量(从大到小)如下: \n"); for(i=1;i<=n;i++) printf("%5.2f",value[i]); printf("\n"); printf("所对应的货物重量如下: \n"); for(i=1;i<=n;i++) printf("%5.2f",W[i]); printf("\n"); i=1; while(M! =0) { M-=W[i];//背包负重递减 values=values+W[i]*value[i];//计算总价值 x[i]=W[i]; s=i; s++; if(M<=W[s]) { values=values+M*value[s];//如果背包的负重小于货物的重量时,则装货量等于背包的剩余载重 x[++i]=M; M=0; } i++; } printf("装货方式如下: \n"); for(i=1;i<=n;i++) printf("%5.2f",x[i]); printf("\n"); printf("最大价值为: values=%5.2f\n",values); printf("\n"); } 收银系统 voidmoneysys() { doubleprice,total=0,givemoney,leamoney; intn,i,k=0,m=0,x=0,y=0; printf("请输入商品的数目: "); scanf("%d",&n); printf("输入每件商品的价格: \n"); for(i=1;i<=n;i++) { printf("第%d件: ",i); scanf("%lf",&price); total=total+price; } printf("总的价格=%5.2f\n",total); printf("输入顾客所给的钱: \n"); scanf("%lf",&givemoney); leamoney=givemoney-total; printf("剩余的钱为%5.2f\n",leamoney); printf("\n各种货币的数目如下: \n"); while(leamoney>=100) { leamoney=leamoney-100; k++; if(leamoney<100) printf("100元=%d张\n",k); } while(leamoney>=20) { leamoney=leamoney-20; x++; if(leamoney<20) printf("20元=%d张\n",x); } while(leamoney>=10) { leamoney=leamoney-10; printf("10元=1张\n"); } while(leamoney>=5) { leamoney=leamoney-5; printf("5元=1张\n"); } while(leamoney>=1) { leamoney=leamoney-1; m++; if(leamoney<1) printf("1元=%d张\n",m); } while(leamoney>=0.5) { leamoney=leamoney-0.5; printf("5角=1\n"); } while(leamoney>=0.2) { leamoney=(float)(leamoney-0.2); y++; if(leamoney<0.2) printf("2角=%d张\n",y); } while(leamoney>=0.1) { leamoney=(float)(leamoney-0.1); printf("1角=1张\n"); } getch(); } (5)流程图 调试过程记录 for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) if(value[j] { t=value[j];value[j]=value[j+1];value[j+1]=t; q=W[j];W[j]=W[j+1];W[j+1]=q; } } printf("单位价值量(从大到小)如下: \n"); for(i=1;i<=n;i++) printf("%5.2f",value[i]); printf("所对应的货物重量如下: \n"); for(i=1;i<=n;i++) printf("%5.2f",W[i]); 货物重量没有进行重新排序,所以输出后无法与单位价值量对应 while(leamoney>=0.2) { leamoney=(float)(leamoney-0.2); y++; if(leamoney<0.2) printf("2角=%d张\n",y); } 没有加上float进行强制转换,导致结果出错 实验结果记录以及与预期结果比较以及分析 总结以及心得体会 贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法;在题目1中,当货物总重量∑Wi小于或等于M时,把所有货物装入,总价值就达到最大。 因此,关键是解决当总重量大于M时装货的方法;不能用价值作为量度标准。 原因是价值大的重量也大,我们按价值大的先放,造成重量消耗过快。 因此可以考虑用Pi/Wi(单位重量价值)来作量度标准。 通过这次实验,增加了我们对贪心策略的理解,增加我们的编程兴趣,很有成就感;锻炼了我们的动手能力,做到了理论和实践相结合。 指导老师评阅意见 指导老师: 年月日 1.背包 #include #include voidbeibao() { floatw[20],p[20],v[20],x[100]; intn,i,j,m=0,s; floatt,q=0.0,value=0.0,M; printf("请输入货物的种数n: \n");scanf("%d",&n); printf("请输入背包的载重M: \n");scanf("%f",&M); printf("请输入各种货物的重量: \n"); for(i=1;i<=n;i++) scanf("%f",&w[i]); printf("请输入各种货物的价值: \n"); for(i=1;i<=n;i++) scanf("%f",&p[i]); for(i=1;i<=n;i++) v[i]=p[i]/w[i]; for(i=1;i { for(j=1;j<=n-i;j++) if(v[j] { t=v[j];v[j]=v[j+1];v[j+1]=t; q=w[j];w[j]=w[j+1];w[j+1]=q; } } printf("\n"); printf("\n单位重量价值(从大到小)如下: \n"); for(i=1;i<=n;i++) printf("%5.2f\t",v[i]); printf("\n"); printf("\n所对应的货物重量如下: \n"); for(i=1;i<=n;i++) { printf("%5.2f\t",w[i]); } printf("\n"); i=1; while(M! =0) { M-=w[i]; value=value+w[i]*v[i]; x[i]=w[i]; s=i; s++; if(M<=w[s]) { value=value+M*v[s]; x[++i]=M; M=0; } i++; } printf("\n装货的方式如下: \n"); for(i=1;i<=n;i++) printf("%5.2f\t",x[i]); printf("\n最大价值为: \n"); printf("value=%5.2f",value); getch(); } intmain() { beibao(); } 2.收银系统 #include #include voidmoneysys() { doubleprice,total=0,givemoney,leamoney; intn,i,k=0,m=0,x=0,y=0; printf("请输入商品的数目: "); scanf("%d",&n); printf("输入每件商品的价格: \n");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪心 算法 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)