算法实现题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<n;i++)//将各行数值读入到数组triangle中
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<k;i++)
if(len[i]>tmp)
tmp=len[i];
returntmp; }
void search(intdep)//search函数用来回溯搜索
{ if(dep==n){ inttmp=comp();
if(tmp<best) best=tmp; return;}
for(inti=0;i<k;i++){ len[i]+=t[dep];
if(len[i]<best) search(dep+1);
len[i]-=t[dep];} }
void main()
{ FILE *in,*out;
in=fopen("input.txt","r");//读入n,k以及每个任务需要时间t[i] fscanf(in,"%d",&n);
fscanf(in,"%d",&k);
for(inti=0;i<n;i++)
{ fscanf(in,"%d",&t[i]); len[i]=0;}
search(0);//第一个任务开始搜索
out=fopen("output.txt","w");
fprintf(out,"%d",best);
}。