实验2、《贪心算法实验》

一、实验目的
  1. 了解贪心算法思想
  2. 掌握贪心法典型问题,如背包问题、作业调度问题等。
二、实验内容
  1. 编写一个简单的程序,实现单源最短路径问题。
  2. 编写一段程序,实现找零。
    【问题描述】当前有面值分别为2角5分,1角,5分,1分的硬币,请给出找n分钱的最佳方案(要求找出的硬币数目最少)。
  3. 编写程序实现多机调度问题
    【问题描述】要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。
三、算法思想分析
  1. 初始化将源点设计为红点集,其余点设计为蓝点,重复选择蓝点集中与源点路径最短的点加入红点集,更新剩余的蓝点集路径,直至蓝点集为空或者只剩下没有连通的点,那么源点到其余所有点的最短路径就出来了。
  2. 找零问题是典型的贪心问题,但是并不代表所有的找零都能用贪心算法找到最优解。只有满足贪心选择性质的找零才能找到最优解,本题满足贪心选择性质,直接先一直选面值最大的硬币,再一次减小即可。
  3. 先对作业按时长进行重排序,再依次找目前用时最短的机器安排工作并加上对应时长,最后总时长为机器中用时最长的那个时长。
四、实验过程分析
  1. 单源最短路径的算法思想并不难,但是在实际编码过程中还是有很多小问题需要注意,首先,一定要新建数组存储路径变化,因为后面计算路径时会用到原数组,如果直接在原数组上更改后面就找不到原数据了,那么就会出现偏差。其次就是建议先写个伪代码,判断的if-else语句比较多,容易搞混,在代码中一定要及时备注,某些代码的功能是什么,不然再次看代码时需要思考很久甚至忘记。
  2. 找零问题直接用while循环或者不断取余取模即可解决。
  3. 作业调度问题大致分为三步,一是排序,二是不断找最短时长的机器安排作业,三是找最长时间为作业完成时间。
五、算法源代码及用户屏幕

1.(1)算法源码

/**********************
单源最短路径问题。
codeblocks C++2018.10.26
**********************/
#include <iostream>
#include <iomanip>
using namespace std;int main()
{   //原始带权有向图int a[5][5] = {{0,10,-1,30,100},{-1,0,50,-1,-1},{-1,-1,0,-1,10},{-1,-1,20,0,60},{-1,-1,-1,-1,0}};//单源最短路径图int b[5][5] = {{0,10,-1,30,100},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};//创建数组红蓝点集int red[5] = {0,-1,-1,-1,-1};int red_N = 0;int blueToRed = 0;int blue[5] = {-1, 1, 2, 3, 4};int blue_N = 0;for(int i=0; i<5-1; i++){//从蓝点集中选出与源点最短路径的蓝点//初始化随机蓝点int blue_min;for(int j=0; j<5; j++){if(blue[j]>=0)blue_min = j;}for(int j=0; j<5; j++){if(blue[j]>0 && b[i][j]>=0 && b[i][j]<b[i][blue_min]){//blue[j]>0表示j是蓝点,a[i][j]>0表示i,j两点连通blue_min = j;}}//将蓝点集中与源点最短路径的点加入到红点集red[++red_N] = blue_min;//将该点从蓝点集中去除blue[blue_min] = -1;//更改加入后的数据for(int j=0; j<5; j++){//判断j点是否为蓝点if(blue[j]>=0){   //j是蓝点if(a[blue_min][j]>0){   //新加入的蓝点与j点连通if(b[i][j]<0){      //上一步i,j两点不连通b[i+1][j] = b[i][blue_min]+a[blue_min][j];}//上一步i,j两点连通且加起来路径比原来短else if(b[i][blue_min] + a[blue_min][j] < b[i][j]){b[i+1][j] = b[i][blue_min]+a[blue_min][j];}else{   //上一步i,j两点连通但加起来路径比原来长b[i+1][j] = b[i][blue_min]+a[blue_min][j];}}else{   //新加入蓝点与j点不连通b[i+1][j] = b[i][j];}}else{   //j不是蓝点b[i+1][j] = b[i][j];}}}//输出原始带权有向图的邻接矩阵图cout<<"Original:"<<endl;//输出第一行cout<<setw(3)<<" ";for(int i=0; i<5; i++)cout<<setw(3)<<i;cout<<endl;for(int i=0; i<5; i++){//输出行号点数cout<<setw(3)<<i;for(int j=0; j<5; j++){cout<<setw(3)<<a[i][j];}cout<<endl;}cout<<endl;//输出最终结果cout<<"Changed:"<<endl;//输出第一行cout<<setw(3)<<" ";for(int i=0; i<5; i++)cout<<setw(3)<<i;cout<<endl;for(int i=0; i<5; i++){//输出行号点数cout<<setw(3)<<i;for(int j=0; j<5; j++){cout<<setw(3)<<b[i][j];}cout<<endl;}return 0;
}

(2)用户屏幕

2.(1)算法源码

/**********************************
实现面值分别为2角5分,1角,5分,1分的硬币找零
codeblocks  C++2018.10.26
**********************************/
#include <iostream>
using namespace std;int main()
{int number;int remain;  //记录剩下的数额cout<<"Please enter the amount of change you want (in cents):";cin>>number;//建立a数组保存已有面值硬币,单位为分double a[4]={25,10,5,1};//建立b数组保存找回每个硬币的数量double b[4]={0,0,0,0};for(int i=0;i<4;i++){int x = 0;   //记录硬币数量while(number>=a[i]){x++;number -= a[i];}b[i] = x;}cout<<"25 cents: "<<b[0]<<endl;cout<<"10 cents: "<<b[1]<<endl;cout<<"5  cents: "<<b[2]<<endl;cout<<"1  cents: "<<b[3]<<endl;return 0;
}

(2)用户屏幕


3.(1)算法源码

/********************************
多机调度问题。
codeblocks C++2018.10.26
********************************/
#include <iostream>
using namespace std;int shortestTime(int b[],int machines);
int longestTime(int b[],int machines);
void quicksort(int a[],int left,int right);
int _partition(int a[],int left,int right);int main()
{//用户输入作业、机器数量,每个作业完成时长int n;cout<<"Please enter the number of jobs:";cin>>n;int a[n];cout<<"Please enter the completion time for each job:"<<endl;for(int i=0;i<n;i++){cin>>a[i];}//对作业进行重排序quicksort(a,0,n);int machine;cout<<"Please enter the number of machines:";cin>>machine;int b[machine];for(int i=0;i<machine;i++)b[i] = 0;int shortT;//找到目前最短时长的机器并安排作业for(int i=n-1;i>=0;i--){shortT = shortestTime(b,machine);b[shortT] += a[i];}int longT;longT = longestTime(b,machine);cout<<"Total processing time:"<<b[longT]<<endl;return 0;
}//快速排序算法
void quicksort(int a[],int left,int right){int q;if(left<right){q=_partition(a,left,right);  //分解quicksort(a,left,q);         //排序quicksort(a,q+1,right);}
}
int _partition(int a[],int left,int right){//p,q分别代表left,rightint p,q;p=left;q=right;//将关键数据暂时存储到变量中,空出a[p]的位置int s = a[p];while(p<q){//从右端开始找,直到找到一个数小于s,然后赋值给a[p]while(p<q && a[q]>=s)q--;if(p<q)a[p]=a[q];//从左端开始找,直到找到一个数大于s,然后将值赋给a[q]while(p<q && a[p]<=s)p++;if(p<q)a[q]=a[p];}a[p]=s;return p;
}//寻找最短时间
int shortestTime(int b[],int machines){int flag = 0;int small = b[flag];for(int i=0;i<machines;i++){if(b[i]<small){small = b[i];flag = i;}}return flag;
}
//寻找最长时间
int longestTime(int b[],int machines){int flag = 0;int longest = b[flag];for(int i=0;i<machines;i++){if(b[i]>longest){longest = b[i];flag = i;}}return flag;
}

(2)用户屏幕

算法设计与分析 实验二 贪心算法相关推荐

  1. 算法设计与分析 实验三 贪心算法

    一. 实验目的和要求 1.掌握贪心算法的基本思想. 2.学习利用贪心算法设计和实现算法的方法. 3.了解利用替换法证明贪心策略是否能获得全局最优解的过程. 4.熟练掌握贪心算法在两个典型图搜索中的应用 ...

  2. 深大算法设计与分析实验二——分治法求最近点对问题

    源代码: 深大算法设计与分析实验二--分治法求最近点对问题代码-C/C++文档类资源-CSDN下载 目录 实验问题 一.实验目的: 二.内容: 三.算法思想提示 产生不重复的随机点算法: 蛮力算法: ...

  3. 算法设计与分析 实验二 分治法求解最近点对问题

    分治法求解最近点对问题 一.实验目的与要求 1.实验基本要求 2.实验亮点 二.实验内容与方法 三.实验步骤与过程 (一)一些准备工作 1.实验流程 2.数据生成与去除重复点 (二)暴力穷举法 1.算 ...

  4. 算法设计与分析 实验三 动态规划算法

    实验3.<动态规划算法实验> 一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10 ...

  5. 算法设计与分析实验二:动态规划法实现TSP问题和0/1背包问题

    [实验目的] 1.熟练掌握动态规划思想及教材中相关经典算法. 2.使用动态规划法编程,求解0/1背包问题和TSP问题. TSP问题 一.实验内容: TSP问题是指旅行家要旅行n个城市,要求每个城市经历 ...

  6. 算法设计与分析 - 磁带存储程序 - 贪心算法(java实现)

    题目描述: 设有n个程序{1,2,...,n}要存放在长度为L的磁带上.程序i存放在磁带上的长度是li,1<=i<=n. 程序存储问题要求确定这n个程序在磁带上的一个存储方案,使得能够在磁 ...

  7. 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...

    <太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...

  8. 算法设计与分析实验指导(完整版)

    算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...

  9. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

最新文章

  1. Installation error: INSTALL_FAILED_VERSION_DOWNGRADE
  2. sql server性能分析--执行sql次数和逻辑次数
  3. mysql5.7多实例安装_MySQL数据库5.7多实例安装
  4. Android好评功能,Android应用评分功能的实现
  5. cocos2d-x游戏实例(13)-简易摇杆控制主角
  6. docker构建oracle集群,docker 构建 oracle数据库 镜像-Go语言中文社区
  7. 拒修电脑后,妹子又约我学机器学习,好烦(甜)!
  8. 2022年企业微信生态研究报告
  9. linux mod_ssl源码安装,linux下不重新编译apache添加安装mod_ssl模块和错误的处理方法...
  10. js定时器让动画隔秒运动
  11. Linux使用命令记录
  12. 通过遍历类向Aspose.cell模板中插入数据
  13. ArcGIS TIN地表面与栅格地表面的生成与互相转换
  14. (记录)操作多层Iframe嵌套内的元素
  15. Objective-C Runtime 运行时之一:类与对象
  16. 模仿showModalDialog的总在最前
  17. LeetCode 739. 每日温度 | Python
  18. 计算机、网络安全、CTF资源总结-The_Growth_Path_Of_A_Pwner(一名安全从业者的成长之路)
  19. NS3 sixth.cc注释
  20. SpringBoot框架,使用Log4j2+Lombok引入日志的方法

热门文章

  1. php批量上传大文件,php实现批量上传图片的技巧
  2. python+vue+elementui校园二手书交易信息网站django
  3. c语言mn回文素数编程,C语言求回文素数
  4. C/C++ 通过域名获取服务器真实IP地址
  5. Python 实现的12306抢票脚本
  6. DLP面曝光3D打印机模型数据矫正
  7. matlab ellip传递函数,地震波观测系统的MATLAB仿真报告.doc
  8. 文加图, 理解Http请求与响应
  9. 【优化选址】遗传算法求解物流配送中心选址【含Matlab源码 1917期】
  10. 单片机能代替PLC吗?过来人告诉你