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