算法设计与分析课后部分习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法实现题3-7 数字三角形问题
问题描述:
给定一个由n行数字组成的数字三角形,如图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。编程任务:
对于给定的由n行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。数据输入:
有文件input.txt提供输入数据。文件的第1行是数字三角形的行数n,1<=n<=100。接下来的n行是数字三角形各行的数字。所有数字在0-99之间。结果输出:
程序运行结束时,将计算结果输出到文件output.txt中。文件第1行中的数是计算出的最大值。
输入文件示例输出文件示
例 input.txt output.txt 5 30 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
源程序:
#include "stdio.h" voidmain()
{ intn,triangle[100][100],i,j;//triangle数组用来存储金字塔数值,n表示行数 FILE *in,*out;//定义in,out两个文件指针变量
in=fopen("input.txt","r");
fscanf(in,"%d",&n);//将行数n读入到变量n中
for(i=0;i for(j=0;j<=i;j++) fscanf(in,"%d",&triangle[i][j]); for(int row=n-2;row>=0;row--)//从上往下递归计算 for(int col=0;col<=row;col++) if(triangle[row+1][col]>triangle[row+1][col+1]) triangle[row][col]+=triangle[row+1][col]; else triangle[row][col]+=triangle[row+1][col+1]; out=fopen("output.txt","w"); fprintf(out,"%d",triangle[0][0]);//将最终结果输出到output.txt中 } 算法实现题4-9 汽车加油问题 问题描述: 一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并证明算法能产出一个最优解。编程任务: 对于给定的n和k个加油站位置,编程计算最少加油次数。数据输入: 由文件input.txt给出输入数据。第1行有2个正整数n和k ,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第 0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。结果输出: 将编程计算出的最少加油次数输出到文件output.txt。如果无法到达目的地,则输出"No Solution“。 输入文件示例输出文件示例 input.txt output.txt 7 7 4 1 2 3 4 5 1 6 6 源程序: #include"stdio.h" void main() { FILE *in,*out; inti,s,n,k,x[100],sum=0;//x数组用来存储距离,sum表示加油次数,s 表示加油后行驶的距离 in=fopen("input.txt","r"); //读入n,k以及距 离 fscanf(in,"%d",&n); fscanf(in,"%d",&k); for(i=0;i<=k;i++) fscanf(in,"%d",&x[i]); for(i=0;i<=k;i++){ if(x[i]>n) printf("No Solution!");} for(i=0,s=0;i<=k;i++){ s+=x[i]; if(s>n) {sum++; s=x[i];} } out=fopen("output.txt","w");//输出结果sum到output.txt中 fprintf(out,"%d",sum); } 算法实现题 5-15最佳调度问题 问题描述: 假设有n个任务由k个可并行工作的机器来完成。完成任务i需要 的时间为ti。试设计一个算法找到出完成这个n个任务的最佳调度,使得完成全部任务的时间最早。编程任务: 对任意给定的整数n和k,以及完成任务i需要的时间为ti,i=1-n。编程计算完成这n个任务的最佳调度。数据输入: 由文件input.txt给出输入数据。第1 行有2个正整数n 和k。第2行的n个正整数是完成n 根任务需要的时间。结果输出: 将计算出的完成全部任务的最早时间输出到文件output.txt。 输入文件示例输出文件示例 input.txt output.txt 7 3 17 2 14 4 16 6 5 3 源程序: #include"stdio.h" intlen[100],t[100],best=1000,n,k; int comp()//comp函数用来计算完成时间 { inttmp=0; for(inti=0;i if(len[i]>tmp) tmp=len[i]; returntmp; } void search(intdep)//search函数用来回溯搜索 { if(dep==n){ inttmp=comp();