分治与贪心

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三分治与贪心

一、实验目的与要求

熟悉C/C++语言的集成开发环境;

通过本实验加深对分治法、贪心算法的理解。

软件环境:操作系统:windows7 旗舰版

集成开发环境:visual studio 2010 旗舰版

硬件环境:处理器:因特尔Core i3 M 380

内存:2GB

二、实验内容:

掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。

三、实验题

1. 【循环赛日程安排问题】计算机学院准备举办一次男生羽毛球单打比赛,现在总共

有16名选手报名,首轮比赛准备采取循环赛的形式进行角逐,要求必须在15天内比完,且每个选手每天只能安排一场比赛,请你帮助学生会安排首轮循环赛的比赛日程表。

2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。售

货员希望用数目最少的硬币找给小孩。假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。给出一种找零钱的贪心算法。

四、实验步骤

理解算法思想和问题要求;

编程实现题目要求;

上机输入和调试自己所编的程序;

验证分析实验结果;

整理出实验报告。

五、实验程序

实验1:

#include

using namespace std;

void dump(int *arr, int len);//输出比赛安排详情

void game(int *team, int len, int id);//分治法安排比赛

void game(int *team, int len, int id){//id为第id轮的安排

int base = 2;

while (id > len/base){

id -= len/base;

base <<= 1;

}

for (int i=0; i

int start = i+base/2+(id-1)*base;

for (int j=0; j

team[i*2*len/base+2*j] = base*j+i;

team[i*2*len/base+2*j+1] = (start+base*j)%len;

}

}

}

//显示分组情况

void dump(int *arr, int len){

for(int i=0;i

cout<

}

int main(){

const int len = 16; //设置参赛人数为16人

int team[len]; //每一轮安排好的选手组合

for (int i=1; i

{

game(team, len, i); //分治法安排比赛

printf("[%02d] ", i);//显示比赛时间天

dump(team, len); //输出比赛安排详情

}

system("pause");

return 0;

}

实验2:

#include

using namespace std;

int main(){

int allmoney=100; //顾客付的钱

int needmoney=33; //收银需要的钱

int backmoney=0; //要找回给顾客的钱

int money[100]={0}; //找钱的组合方式

int i=0; //循环控制数组下表变换

backmoney=allmoney-needmoney;

while(backmoney) //当要找的钱为0时循环结束{ if(backmoney>=25)//优先考虑找25元是否大于0

{

money[i]=25; //向找钱组合添加一个25

backmoney-=25;//要找回顾客的钱扣除25元}

else if(backmoney>=10)

{

money[i]=10;

backmoney-=10;

}

else if(backmoney>=5)

{

money[i]=5;

backmoney-=5;

}

else if(backmoney>=1)

{

money[i]=1;

backmoney-=1;

}

i++;

}

cout<<"贪心法求的要找回钱组合为:"<

for(int j=0;money[j]!=0;j++)

cout<

cout<

system("pause");

return 0;

}

六、实验结果

实验1:

实验2:

七、实验分析

实验一的核心就是每次把组内奇数和偶数号码的选手分开成两组,再把本次分组分开的小组又编号奇数和偶数,再把奇数号码合并一组,偶数号码合并一组,一步步往下分,直到最后只有两个选手为止。

实验二的核心就是循环时,优先考虑找面值大的钱,25>10>5>1,那么就先选出了最优的返回面值,当要找的钱为0时则不用再循环了。

相关文档
最新文档