目前仅给出部分程序示例,后续会逐步完善,代码仅供参考
第3章 动态规划 Chapter 3 Dynamic Programming
算法实现题3-1 独立任务最优调度问题 Problem 3.1 Independent Task Scheduling
´问题描述:
用 2 台处理机 A 和 B 处理 n 个作业。设第 i 个作业交给机器 A 处理时需要时间
a
i
,若由机器 B 来处理,则需要时间b
i
。由于各作业的特点和机器的性能关系,很可能对于某些 i,有 a
i >
b
i
,而对于某些 j,j≠i,有
a
j
<
b
j
。既不能将一个作业分开由 2 台机器处理,也没有一台机器能同时处理 2 个作业。设计一个动态规划算法,使得这 2 台机器处理完这 n 个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。
´
编程任务:
对于给定的 2 台处理机 A 和 B 处理 n 个作业,找出一个最优调度方案,使 2 台机器处理完这 n 个作业的时间最短。
´
数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行是 1 个正整数 n, 表示要处理 n 个作业。
接下来的 2 行中,每行有 n 个正整数,分别表示处理机 A 和 B 处理第 i 个作业需要的处理时间。
´
结果输出
:
程序运行结束时,将计算出的最短处理时间输出到文件 output.txt 中。
输入、
输出文件示例
算法实现题3-2 最优批处理问题 Problem 3.2 Optimal Batch Process
´问题描述:
在一台超级计算机上,编号为
1,2, ..., n
的
n
个作业等待批处理。批处理的任务就是将这 n
个作业分成若干批,每批包含相邻的若干作业。从时刻 0 开始,分批加工这些作业。在每批作业开始前,机器需要启动时间 S
,而完成这批作业所需的时间是单独完成批中各个作业需要时间的总和。单独完成第i
个作业所需的时间是
,所需的费用是它的完成时刻乘以一个费用系数
。同一批作业将在同一时刻完成。例如,如果在时刻
T
开始一批作业x,x+1,...,x+k
,则这一批作业的完成时刻均为。最优批处理问题就是要确定总费用最小的批处理方案。例如,假定有 5 个作业等待批处理,且
如果采用批处理方案
{1,2},{3},{4,5}
,则各作业的完成时间分别为
(5,5,10,14,14)
,各作业的费用分别为(15,10,30, 42,56)
,因此,这个批处理方案总费用是 153。
´算法设计:
对于给定的待批处理的
n
个作业,计算其总费用最小的批处理方案。
´数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行是待批处理的作业数
n
,第 2 行是启动时间 S
。接下来每行有 2 个数,分别为单独完成第
i
个作业所需的时间是
和所需的费用系数
。
´结果输出:
将计算出的最小总费用输出到文件 output.txt 中。
输入、输出文件示例:
算法实现题3-3 石子合并问题 Problem 3.3 Pebble Merging
´
问题描述:
在一个圆形操场的四周摆放着 n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将 n 堆石子合并成一堆的最小得分和最大得分。
´
编程任务:
对于给定 n 堆石子,编程计算合并成一堆的最小得分和最大得分。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行是正整数
n
,
1≤
n ≤
100
,表示有
n
堆石子。 第二行有 n
个数,分别表示每堆石子的个数。
´
结果输出
:
程序运行结束时,将计算结果输出到文件
output.txt
中。文件的第
1
行中的数是最小得
分;第
2
行中的数是最大得分;
输入、输出文件示例:
示例代码:
/*因为石子绕成一个环,不是一条直线,所以dp[i][j]的含义为从第i堆开始,合并j堆石子能得到的最优值
则易得状态转移方程为dp1[i][j]=better(dp1[i][j],dp1[i][k]+dp1[(i+k-1)%n+1][j-k]+sum[i][j]);*/
#include<stdio.h>
#define M 110
const int INF = 1000000000;
int dp1[M][M],dp2[M][M]; //定义最优解数组,用于后续得出最大得分和最小得分
int sum[M][M];//二维数组存放石子堆合并后石子数量
int num[M];//定义石子堆数量数组用于存放各个石子堆石子数
//以下两个函数为比较大小函数 ,通过对他们的调用返回两数比较的结果
int min(int a,int b)
{
return a<b?a:b;//返回较小值
}
int max(int a,int b)
{
return a>b?a:b;//返回较大值
}
//主函数
int main()
{
FILE *fp1,*fp2;//定义文件指针
fp1=fopen("D:\\ch3\\prog33\\test\\input.txt","r+");//打开数据输入文件
fp2=fopen("D:\\ch3\\prog33\\answer\\output.txt","w+");//打开数据输出文件
int n,i,j,k;//定义变量,n为石子堆堆数量,i,j,k为控制循环的变量
fscanf(fp1,"%d",&n);//读入石子堆堆数量
for(i=1;i<=n;i++)
fscanf(fp1,"%d",&num[i]);//将石子堆数量逐一读入数组
for(i=1;i<=n;i++)
sum[i][1]=num[i];//将石子堆数量存入矩阵第一列,为准备后续计算
for(j=2;j<=n;j++)
for(i=1;i<=n;i++)
sum[i][j]=sum[i%n+1][j-1]+num[i];//二维数组每增加一列,相邻石子堆合并一次,每一列的数字为该石子堆与(后面一石子堆合并第j-1次后)之和的数量
for(i=0;i<=n;i++)
dp1[i][1]=dp2[i][1]=0;//将dp1、dp2数组第一列初始化为0
for(j=2;j<=n;j++)//比较并记录最优过程得分
{
for(i=1;i<=n;i++)
{
dp1[i][j]=0; //赋dp1初值为0
dp2[i][j]=INF;//赋dp2初值为极大值
for(k=1;k<j;k++)
{
dp1[i][j]=max(dp1[i][j],dp1[i][k]+dp1[(i+k-1)%n+1][j-k]+sum[i][j]);//枚举各次石子合并后的最大值,比较得出最大得分
dp2[i][j]=min(dp2[i][j],dp2[i][k]+dp2[(i+k-1)%n+1][j-k]+sum[i][j]);//枚举各次石子合并后的最大值,比较得出最小得分
}
}
}
int ansmi=INF,ansmx=0;
for(i=1;i<=n;i++)
{
ansmx=max(ansmx,dp1[i][n]);//得出最大得分
ansmi=min(ansmi,dp2[i][n]);//得出最小得分
}
fprintf(fp2,"%d\n%d\n",ansmi,ansmx);//输出最大得分和最小得分
fclose(fp1);
fclose(fp2);
return 0;
}
算法实现题3-4 数字三角形问题 Problem 3.4 Number Triangles
´
问题描述:
给定一个由
n
行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
´
编程任务:
对于给定的由 n 行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行是数字三角形的行数
n
,
1≤
n≤
100
。接下
来
n
行是数字三角形各行中的数字。所有数字在
0-99
之间。
´
结果输出
:
程序运行结束时,将计算结果输出到文件 output.txt 中。文件的第 1 行中的数是计算
出的最大值。
输入、输出文件示例:
算法实现题3-5 乘法表问题 Problem 3.5 Multiplication Table
´
问题描述:
定义于字母表
= {a,b,c}
上的乘法表如下
a | b | c | |
a | b | b | a |
b | c | b | a |
c | a | c | c |
依此乘法表,对任一定义于
上的字符串,适当加括号后得到一个表达式。例如,对于字符串 x=bbbba,它的一个加括号表达式为(b(bb))(ba)。依乘法表,该表达式的值为 a。试设计一个动态规划算法,对任一定义于S
上的字符串
x
=
x
1
x
2 ...
x
n
,计算有多少种不同的加括号方式,使由 x导出的加括号表达式的值为 a。
´
编程任务:
对于给定的字符串
x
=
x
1
x
2 ...
x
n
,计算有多少种不同的加括号方式,使由 x 导出的加括号表达式的值为 a。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行中给出一个字符串。
´
结果输出
:
程序运行结束时,将计算结果输出到文件
output.txt
中。文件的第
1
行中的数是计算出的加括号方式数。
输入、输出文件示例
算法实现题3-6 租用游艇问题 Problem 3.6 Renting Boats
´
问题描述:
长江游艇俱乐部在长江上设置了 n 个游艇出租站 1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站 i 到游艇出租站 j 之间的租金为 r(i,j),1≤
i<j≤
n。试设计一个算法,计算出从游艇出租站 1 到游艇出租站 n 所需的最少租金。
´
编程任务:
对于给定的游艇出租站 i 到游艇出租站 j 之间的租金为 r(i,j),1≤
i<j≤
n,编程计算从游艇出租站 1 到游艇出租站 n 所需的最少租金。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行中有
1
个正整数
n
(
n≤200
),表示有
n 个游艇出租站。接下来的 n-1
行是
r(i,j),1≤
i<j≤
n
。
´
结果输出
:
程序运行结束时,将计算出的从游艇出租站
1
到游艇出租站
n
所需的最少租金输出到文件 output.txt
中。
输入、输出文件示例:
算法实现题3-7 汽车加油行驶问题 Problem 3.7 Car Traveling
´
问题描述:
给定一个
N*N
的方形网格,设其左上角为起点◎,坐标为(
1,
1
),
X
轴向右为正,
Y 轴向下为正,每个方格边长为 1
。一辆汽车从起点◎出发驶向右下角终点▲,其坐标为(
N
,N)。在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:
(
1
)汽车只能沿网格边行驶,装满油后能行驶
K
条网格边。出发时汽车已装满油,在起点与终点处不设油库。
(
2
)当汽车行驶经过一条网格边时,若其
X
坐标或
Y
坐标减小,则应付费用
B
,否则免付费用。
(
3
)汽车在行驶过程中遇油库则应加满油并付加油费用
A
。
(
4
)在需要时可在网格点处增设油库,并付增设油库费用
C
(不含加油费用
A
)。
(
5
)
(1)
~
(4)
中的各数
N
、
K
、
A
、
B
、
C
均为正整数。
´
编程任务:
求汽车从起点出发到达终点的一条所付费用最少的行驶路线。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第一行是
N
,
K
,
A
,
B
,
C
的值,
2 ≤
N ≤
100
,2 ≤K ≤
10
。第二行起是一个
N*N
的
0-1
方阵,每行
N
个值,至
N+1
行结束。方阵的第
i 行第 j
列处的值为
1
表示在网格交叉点(
i
,
j
)处设置了一个油库,为
0
时表示未设油库。各行相邻的 2
个数以空格分隔。
´
结果输出
:
程序运行结束时,将找到的最优行驶路线所需的费用,即最小费用输出到文件
output.txt 中。文件的第 1
行中的数是最小费用值。
输入、输出文件示例:
算法实现题3-8 最小m段和问题 Problem 3.8 Minimal m Sums
´
问题描述:
给定
n
个整数组成的序列,现在要求将序列分割为
m
段,每段子序列中的数在原序列中连续排列。如何分割才能使这 m
段子序列的和的最大值达到最小?
´
编程任务:
给定 n 个整数组成的序列,编程计算该序列的最优 m 段分割,使 m 段子序列的和的最大值达到最小。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行中有
2
个正整数
n
和
m
。正整数
n
是序列的长度;正整数 m
是分割的断数。
接下来的一行中有 n
个整数。
´
结果输出
:
程序运行结束时,将计算结果输出到文件
output.txt
中。文件的第
1
行中的数是计算出的 m
段子序列的和的最大值的最小值。
输入、输出文件示例:
算法实现题3-9 圈乘运算问题 Problem 3.9 Circle Multiplication
´
问题描述:
关于整数的 2 元圈乘运算※定义为
(X※Y)=10 进制整数 X 的各位数字之和*10 进制整数 Y 的最大数字+Y 的最小数字。
例如,(9※30)=9*3+0=27。
对于给定的 10 进制整数 X 和 K,由 X 和#运算可以组成各种不同的表达式。试设计一个
算法,计算出由 X 和※ 运算组成的值为 K 的表达式最少需用多少个※ 运算。
´
编程任务:
给定
10
进制整数
X
和
K (1
≤
X,K
≤
)
。编程计算由
X 和※ 运算组成的值为
K
的表达式最少需用多少个※ 运算。
´
数据输入:
输入数据由文件名为
input.txt
的文本文件提供。
每一行有 2 个
10
进制整数
X
和
K
。
最后一行是
0 0
。
´
结果输出
:
程序运行结束时,将找到的最少
Ä
运算个数输出到文件
output.txt
中。
输入、输出文件示例:
算法实现题3-10 最大长方体问题 Problem 3.10 Maximum Cube
´
问题描述:
一个长,宽,高分别为
m,n,p
的长方体被分割成个
m*n*p
个小立方体。每个小立方体内有一个整数。试设计一个算法,计算出所给长方体的最大子长方体。子长方体的大小由它所含所有整数之和确定。
´
编程任务:
对于给定的长,宽,高分别为 m,n,p 的长方体,编程计算最大子长方体的大小。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行是
3
个正整数
m,n,p
,
1≤
m,n,p≤
50
。接下来 m*n
行每行
p
个正整数,表示小立方体中的数。
´
结果输出
:
程序运行结束时,将计算结果输出到文件 output.txt 中。文件的第 1 行中的数是计算出的最大子长方体的大小。
输入、输出文件示例:
算法实现题3-11 正则表达式匹配问题 Problem 3.11 Regular Expressions
´
问题描述:
许多操作系统采用正则表达式实现文件匹配功能。一种简单的正则表达式由英文字母、数字及通配符“*”和“?”组成。“?”代表任意一个字符。“*”则可以代表任意多个字符。现要用正则表达式对部分文件进行操作。
试设计一个算法,找出一个正则表达式,使其能匹配的待操作文件最多,但不能匹配任何不进行操作的文件。所找出的正则表达式的长度还应是最短的。
´
编程任务:
对于给定的待操作文件,找出一个能匹配最多待操作文件的正则表达式。
´
数据输入:
由文件 input.txt 提供输入数据。文件由 n(1≤n≤250)行组成。每行给出一个文件名。文件名由英文字母和数字组成。英文字符要区分大小写,文件名长度不超过 8 个字符。文件名后是一个空格符和一个字符“+”或“-”。“+”表示要对该行给出的文件进行操作,“-”表示不进行操作。
´
结果输出
:
程序运行结束时,将计算出的最多文件匹配数和最优正则表达式输出到文件output.txt 中。文件的第 1 行中的数是计算出的最多文件匹配数。文件的第 1 行是最优正则表达式。
输入、输出文件示例:
算法实现题3-12 双调旅行售货员问题 Problem 3.12 Bitonic Tours
´
问题描述:
欧氏旅行售货员问题是对给定的平面上
n
个点确定一条连接这n个点的长度最短的哈密顿回路。由于欧氏距离满足三角不等式,所以欧氏旅行售货员问题是一个特殊的具有三角不等式性质的旅行售货员问题。它仍是一个
NP
完全问题。最短双调
TSP 回路是欧氏旅行售货员问题的特殊情况。平面上
n
个点的双调
TSP 回路是从最左点开始,严格地由左至右直到最右点,然后严格地由右至左直至最左点,且连接每一个点恰好一次的一条闭合回路。
´
编程任务:
给定平面上
n
个点,编程计算这
n
个点的最短双调
TSP
回路。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
1
个正整数
n,表示给定的平面上的点数。接下来的
n
行中,每行
2
个实数,分别表示点的
x
坐标和
y
坐标。
´
结果输出
:
将计算的最短双调
TSP
回路的长度(保留
2
位小数)输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-13 最大k乘积问题 Problem 3.13 Maximum k Multiplications
´
问题描述:
设
I
是一个
n
位十进制整数。如果将
I
划分为
k
段,则可得到
k
个整数。这
k 个整数的 乘积称为
I
的一个
k
乘积。试设计一个算法,对于给定的
I
和
k
,求出
I
的最大
k
乘积。
´
编程任务:
对于给定的 I 和 k,编程计算 I 的最大 k 乘积。
´
数据输入:
由文件
input.txt
提供输入数据。文件的第
1
行中有
2
个正整数
n
和
k
。正整数
n 是序列 的长度;正整数
k 是分割的段数。 接下来的一行中是一个
n
位十进制整数。(
n<=10
)
´
结果输出
:
程序运行结束时,将计算结果输出到文件
output.txt
中。文件的第
1 行中的数是计算出的最大
k
乘积。
输入文件示例:
算法实现题3-14 最少费用购物 Problem 3.14 Cheapest Shopping
´
问题描述:
商店中每种商品都有标价。例如,一朵花的价格是 2 元。一个花瓶的价格是 5 元。为了吸引顾客,商店提供了一组优惠商品价。优惠商品是把一种或多种商品分成一组,并降价销售。例如,3 朵花的价格不是 6 元而是 5 元。2 个花瓶加 1 朵花的优惠价是 10 元。试设计一个算法,计算出某一顾客所购商品应付的最少费用。
´
编程任务:
对于给定欲购商品的价格和数量,以及优惠商品价,编程计算所购商品应付的最少费用。
´
数据输入:
由文件
input.txt
提供欲购商品数据。文件的第
1 行中有 1 个整数 B(0≤B≤5),表示所购商品种类数。接下来的 B 行,每行有 3 个数 C,K 和 P。C 表示商品的编码(每种商品有唯一编码),1≤C≤999。K 表示购买该种商品总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。请注意,一次最多可购买 5*5=25 件商品。
由文件
offer.txt 提供优惠商品价数据。文件的第 1 行中有 1 个整数 S(0≤S≤99),表示共有 S 种优惠商品组合。接下来的 S 行,每行的第一个数描述优惠商品组合中商品的种类数 j。接着是 j 个数字对(C,K),其中 C 是商品编码,1≤C≤999。K 表示该种商品在此组合中的数量,1≤K≤5。每行最后一个数字 P(1≤ P≤9999)表示此商品组合的优惠价。
´
结果输出
:
程序运行结束时,将计算出的所购商品应付的最少费用输出到文件
output.txt
中。
输入、输出文件示例:
算法实现题3-15 收集样本问题 Problem 3.15 Collecting Samples
´
问题描述:
机器人 Rob 在一个有 n*n 个方格的方形区域 F 中收集样本。(i,j)方格中样本的价值为 v(i,j),如下图所示。
Rob 从方形区域 F 的左上角 A 点出发,向下或向右行走,直到右下角的 B 点,在走过的路上,收集方格中的样本。Rob 从 A 点到 B 点共走 2 次,试找出 Rob 的 2 条行走路径,使其取得的样本总价值最大。
´
编程任务:
给定方形区域 F 中的样本分布,编程计算 Rob 的 2 条行走路径,使其取得的样本总价值最大。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
1
个正整数
n
,表示方形区域 F 有 n*n 个方格。
接下来每行有
3
个整数,前
2
个表示方格位置,第
3
个数为该位置样本价值。最后一行是
3
个
0
。
´
结果输出
:
将计算的最大样本总价值输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-16 最优时间表问题 Problem 3.16 Optimal Scheduling
´
问题描述:
一台精密仪器的工作时间为 n 个时间单位。与仪器工作时间同步进行若干仪器维修程序。一旦启动维修程序,仪器必须进入维修程序。如果只有一个维修程序启动,则必须进入该维修程序。如果在同一时刻有多个维修程序,可任选进入其中的一个维修程序。维修程序必须从头开始,不能从中间插入。一个维修程序从第
s
个时间单位开始,持续
t 个时间单位,则该维修程序在第
s+t-1 个时间单位结束。为了提高仪器使用率,希望安排尽可能少的维修时间。
´
编程任务:
对于给定的维修程序时间表,编程计算最优时间表。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
2
个正整数
n
和
k
。
n 表示仪器的工作时间单位;k 是维修程序数。接下来的
k
行中,每行有
2
个表示维修程序的整数
s
和
t,该维修程序从第
s
个时间单位开始,持续
t
个时间单位。
´
结果输出
:
将计算出的最少维修时间输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-17 字符串比较问题 Problem 3.17 String Comparison
´
问题描述:
对于长度相同的
2
个字符串
A
和
B
,其距离定义为相应位置字符距离之和。
2 个非空格字符的距离是它们的
ASCII
码之差的绝对值。空格与空格的距离为
0;空格与其它字符的距离为一定值
k
。
在一般情况下,字符串
A
和
B
的长度不一定相同。字符串
A
的扩展是在
A 中插入若干空格字符所产生的字符串。在字符串
A
和
B 的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串
A
和
B 的扩展距离。对于给定的字符串
A
和
B
,试设计一个算法,计算其扩展距离。
´
编程任务:
对于给定的字符串
A
和
B
,编程计算其扩展距离。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行是字符串
A
;第
2
行是字符串
B
。第
3 行是空格与其它字符的距离定值
k
。
´
结果输出
:
将计算出的字符串
A
和
B
的扩展距离输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-18 有向树k中值问题 Problem 3.18 k Median of Directed Trees
´
问题描述:
给定一棵有向树 T,树 T 中每个顶点 u 都有一个权 w(u);树的每条边(u,v)也都有一个非负边长 d(u,v)。有向树 T 的每个顶点 u 可以看作客户,其服务需求量为 w(u)。每条边(u,v)的边长 d(u,v) 可以看作运输费用。如果在顶点 u 处未设置服务机构,则将顶点 u 处的服务需求沿有向树的边(u,v)转移到顶点 v 处服务机构需付出的服务转移费用为 w(u)*d(u,v)。树根处已设置了服务机构,现在要在树 T 中增设 k 处服务机构,使得整棵树 T 的服务转移费用最小。
´
编程任务:
对于给定的有向树 T,编程计算在树 T 中增设 k 处服务机构的最小服务转移费用。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
2
个正整数
n
和
k
。n 表示有向树 T 的边数;k是要增设的服务机构数。有向树 T 的顶点编号为 0,1,…,n。根结点编号为 0。接下来的 n
行中,每行有表示有向树 T 的一条有向边的
3
个整数。第
i+1
行的
3
个整数
w
i
,v
i
,d
i分别表示编号为
i
的顶点的权为
w
i
,相应的有向边为
(i, v
i
)
,其边长为
d
i
。
´
结果输出
:
将计算的最小服务转移费用输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-19 有向树独立k中值问题 Problem 3.19 k Independent Median of Directed Trees
´
问题描述:
给定一棵有向树 T,树 T 中每个顶点 u 都有一个权 w(u);树的每条边(u,v)也都有一个非负边长 d(u,v)。有向树 T 的每个顶点 u 可以看作客户,其服务需求量为 w(u)。每条边(u,v)的边长 d(u,v) 可以看作运输费用。如果在顶点 u 处未设置服务机构,则将顶点 u 处的服务需求沿有向树的边(u,v)转移到顶点 v 处服务机构需付出的服务转移费用为 w(u)*d(u,v)。树根处已设置了服务机构,现在要在树 T 中增设 k 处独立服务机构,使得整棵树 T 的服务转移费用最小。服务机构的独立性是指任何 2 个服务机构之间都不存在有向路经。
´
编程任务:
对于给定的有向树 T,编程计算在树 T 中增设 k 处独立服务机构的最小服务转移费用。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
2
个正整数
n
和
k
。n 表示有向树 T 的边数;k 是要增设的服务机构数。有向树 T 的顶点编号为 0,1,…,n。根结点编号为 0。接下来的 n
行中,每行有表示有向树 T 的一条有向边的
3
个整数。第
i+1
行的
3
个整数
w
i
,v
i
,d
i分别表示编号为
i
的顶点的权为
w
i
,相应的有向边为
(i, v
i
)
,其边长为
d
i
。
´
结果输出
:
将计算的最小服务转移费用输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-20 有向直线m中值问题 Problem 3.20 k Median of Directed Line
´
问题描述:
给定一条有向直线 L 以及 L 上的 n+1 个点 。有向直线 L 上的每个点 都有一个权;每条有向边 也都有一个非负边长 。有向直线 L 上的 每个点 可以看作客户,其服务需求量为 。每条边的边长 可以看作运输费用。如果在点 处未设置服务机构,则将点 处的服务需求沿有向边转移到点 处服务机构需付出的服务转移费用为 。在点处已设置了服务机构,现在要在直线 L 上增设 k 处服务机构,使得整体服务转移费用最小。
´
编程任务:
对于给定的有向直线 L,编程计算在直线 L 上增设 k 处服务机构的最小服务转移费用。
´
数据输入:
由文件
input.txt
给出输入数据。第 1 行有 1 个正整数 n,表示有向直线 L 上除了点 外还有 n 个点 。接下来的 n
行中,每行有
2
个整数。第
i+1
行的
2 个整数分别表示
和
。
´
结果输出
:
将计算的最小服务转移费用输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-21 有向直线2中值问题 Problem 3.21 2 Median of Directed Line
´
问题描述:
给定一条有向直线 L 以及 L 上的 n+1 个点 。有向直线 L 上的每个点 都有一个权 ;每条有向边
也都有一个非负边长
。有向直线 L 上的每个点
可以看作客户,其服务需求量为
。每条边
的边长
可以看作运输费用。如果在点
处未设置服务机构,则将点
x
i
处的服务需求沿有向边转移到点
处服务机构需付出的服务转移费用为
。在点 处已设置了服务机构,现在要在直线 L 上增设 2 处服务机构,使得整体服务转移费用最小。
´
编程任务:
对于给定的有向直线 L,编程计算在直线 L 上增设 2 处服务机构的最小服务转移费用。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
1
个正整数
n,表示有向直线 L 上除了点 外还有 n 个点 。接下来的
n
行中,每行有
2
个整数。第
i+1
行的
2 个整数分别表示
和
。
´
结果输出
:
将计算的最小服务转移费用输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-22 树的最大连通分支问题 Problem 3.22 Maximum Connected Component of Trees
´
问题描述:
给定一棵树 T,树中每个顶点 u 都有一个权 w(u),权可以是负数。现在要找到树 T 的一个连通子图使该子图的权之和最大。
´
编程任务:
对于给定的树 T,编程计算树
T
的最大连通分支。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
1
个正整数
n,表示树 T 有 n 个顶点。树 T 的顶点编号为 1,…,n。第 2 行有 n 个整数,表示 n 个顶点的权值。接下来的
n-1 行中,每行有表示树 T 的一条边的
2
个整数
u,v
,表示顶点
u
与顶点
v
相连。
´
结果输出
:
将计算出的最大连通分支的权值输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-23 直线k中值问题 Problem 3.23 k Median of Line
´
问题描述:
在一个按照南北方向划分成规整街区的城市里,
n 个居民点分布在一条直线上的 n 个坐标点
x
1
< ...
<
x
n
处。居民们希望在城市中至少选择
1 个,但不超过 k 个居民点建立服务机构。在每个居民点
x
i
处,服务需求量为
w
i ≥
0
,在该居民点设置服务机构的费用为
c
i ≥
0。假设居民点
x
i
到距其最近的服务机构的距离为
d
i
,则居民点
x
i
的服务费用为
w
i ×
di 。建立 k 个服务机构的总费用为 A+B。A 是在 k 个居民点设置服务机构的费用的总和;B 是
n
个居民点服务费用的总和。
´
编程任务:
对于给定直线 L 上的 n 个点
x
1
< ...
<
x
n ,编程计算在直线 L 上最多设置 k 处服务机构的最小总费用。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
2
个正整数
n
和
k
。
n 表示直线 L 上有 n 个点 x
1
< ...
<
x
n
;k 是服务机构总数的上限。接下来的
n
行中,每行有
3
个整数。第
i+1
行的 3 个整数
x
i
,
w
i
,
c
i ,分别表示相应居民点的位置坐标,服务需求量和在该点设置服务机构的费用。
´
结果输出
:
将计算的最小服务费用输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-24 直线k覆盖问题 Problem 3.24 k Cover of Line
´
问题描述:
´
编程任务:
对于给定直线 L 上的 n 个点
x
1
< ...
<
x
n ,编程计算在直线 L 上最多设置 k 处服务机构的最小覆盖费用。
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
3
个正整数
n
,
k
和
r
。
n 表示直线 L 上有 n 个点
x
1
<
<
x
n
;k 是服务机构总数的上限;r 是服务机构的覆盖半径。接下来的
n 行中,每行有
3
个整数。第
i+1
行的
3
个整数
x
i
,w
i
,c
i
分别表示
x
i
,
w
(
i
)
和
c
(
i
)
。
´
结果输出
:
将计算的最小覆盖费用输出到文件
output.txt
。
输入、输出文件示例:
算法实现题3-25 m处理器问题 Problem 3.25 m Processors
´问题描述:
´
编程任务:
´
数据输入:
由文件
input.txt
给出输入数据。第
1
行有
2
个正整数
n
和
m
。
n 表示数据包个数,m 表示处理器数。接下来的
1
行中有
n
个整数,表示
n
个数据包的大小。
´
结果输出
:
将计算的处理器均衡负载量输出到文件
output.txt
。保留
2
位小数。
输入、输出文件示例: