General Search
Description
试设计一个用回溯法搜索一般解空间的函数。该函数的参数包括:生成解空间中下一扩展结点的函数、结点可行性判定函数和上界函数等必要的函数,并将此函数用于解图的m着色问题。
图的m 着色问题描述如下:给定无向连通图G 和m 种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G 中每条边的2 个顶点着不同颜色,则称这个图是m 可着色的。图的m着色问题是对于给定图G和m 种颜色,找出所有不同的着色法。
编程任务:
对于给定的无向连通图G 和m种不同的颜色,编程计算图的所有不同的着色法。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行有3 个正整数n,k 和m,表示给定的图G 有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。
Output
对应每组输入,输出的每行是计算出的不同的着色方案数。
Sample Input
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
Sample Output
48
排列树问题 对于给定的n个圆,编程计算最小长度排列。
Description
试设计一个用回溯法搜索排列空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解圆排列问题。
圆排列问题描述如下:给定n 个大小不等的圆c1 , c2 ,..., cn ,现要将这n 个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n 个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给的3 个圆的半径分别为1,1,2 时,这3 个圆的最小长度的圆排列是1,2,1,其最小长度为2 + 4*sqr(2)。
编程任务:
对于给定的n个圆,编程计算最小长度排列。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行是1 个正整数n,表示有n个圆。第2行有n个正数,分别表示n个圆的半径。
Output
对应每组输入,输出的每行是计算出的最小长度,保留3 位小数。
Sample Input
3
1 1 2
Sample Output
7.657
0-1 Knapsack 试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。
Description
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。
0-1 背包问题描述如下:给定n 种物品和一个背包。物品i的重量是wi,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,也不能只装入部分的物品i。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。
Output
对应每组输入,输出的2行是装入背包物品的最大价值和最优装入方案。
Sample Input
5 10
6 3 5 4 6
2 2 6 5 4
Sample Output
15
1 1 0 0 1
子集树问题 试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。
Description
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。
装载问题描述如下:有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行有2个正整数n和c,n是集装箱数,c是轮船的载重量。接下来的1行中有n个正整数,表示集装箱的重量。
Output
对应每组输入,输出的每行是将计算出的最大装载重量。
Sample Input
5 10
7 2 6 5 4
Sample Output
10
汽车加油问题 对于给定的n和k个加油站位置,编程计算最少加油次数。
Description
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并证明算法能产生一个最优解。
编程任务:
对于给定的n和k个加油站位置,编程计算最少加油次数。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行有2 个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满油。第k+1 个加油站表示目的地。
Output
对应每组输入,输出的每行是计算出的最少加油次数。如果无法到达目的地,则输出”No Solution”。
Sample Input
7 7
1 2 3 4 5 1 6 6
Sample Output
4
程序存储问题 对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。
Description
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是li ,1 ≤ i ≤ n。程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。
编程任务:
对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1 行中,有n个正整数,表示程序存放在磁带上的长度。
Output
对应每组输入,每行输出的是计算出的最多可以存储的程序数。
Sample Input
6 50
2 3 13 8 80 20
Sample Output
5
Optimal Services
Description
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti ,1 ≤ i ≤ n。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。
编程任务:
对于给定的n个顾客需要的服务时间,编程计算最优服务次序。
Input
输入由多组测试数据组成。
每组测试数据输入的第一行是正整数n,表示有n 个顾客。接下来的1行中,有n个正整数,表示n个顾客需要的服务时间。
Output
对应每组输入,输出的每行是计算出的最小平均等待时间。
Sample Input
10
56 12 1 99 1000 234 33 55 99 812
Sample Output
532.00
数据结构课程设计大作业 分油问题
有三个大小不等的、没有刻度的油桶,分别能装x、y、z公斤油。开始时,第一个油桶装满油,另外两个油桶为空,要求找出一种步骤最少的分油方法,在某一个油桶上分出targ公斤油。
输入:三个油桶的装油量(例如分别为80、50、30公斤)和需要分出的油量targ公斤(例如为40公斤);
背包问题 贪心算法
Description
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。
编程任务:
对于给定的n种物品和一个背包容量C,编程计算装入背包中最大的物品总价值。
Input
输入由多组测试数据组成。
每组测试数据输入的第1行中有2个正整数n和C。正整数n是物品个数;正整数C是背包的容量。接下来的2行中,第一行有n个正整数,分别表示n个物品的重量,它们之间用空格分隔;第二行有n个正整数,分别表示n个物品的价值,它们之间用空格分隔。
Output
对应每组输入,输出的每行是计算出的装入背包中最大的物品总价值,保留一位有效数字。
Sample Input
3 50
10 20 30
60 100 120
Sample Output
240.0
Lecture Halls 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)
Problem D:Lecture Halls
Description
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)
编程任务:
对于给定的k个待安排的活动,编程计算使用最少会场的时间表。
Input
输入数据是由多组测试数据组成。每组测试数据输入的第一行有1 个正整数k,表示有k个待安排的活动。接下来的k行中,每行有2个正整数,分别表示k个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。
Output
对应每组输入,输出的每行是计算出的最少会场数。
Sample Input
5
1 23
12 28
25 35
27 80
36 50
Sample Output
3
MAX SUM 给定由n整数(可能为负数)组成的序列 {a1,a2,…,an},求该序列形如ai+ai+1,…,+aj的子段和的最大值。当所有的整数均为负数时定义其最大子段和为0。
Description
给定由n整数(可能为负数)组成的序列 {a1,a2,…,an},求该序列形如ai+ai+1,…,+aj的子段和的最大值。当所有的整数均为负数时定义其最大子段和为0。
Input
输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个整数,接下来一行有n个整数,它们之间用空格隔开.
Output
你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的最大子段和.
Sample Input
1
6
-2 11 -4 13 -5 -2
Sample Output
20
Number Triangles 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
Description
给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
编程任务:对于给定的由n 行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。
Input
输入数据是由多组测试数据组成。第1 行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0至99之间。
Output
对应每组测试数据,每行输出的是计算出的最大值。
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
最长公共子序列 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X={A,B,C,B,D,B,A},Y={B,D,C,A,B,A},则序列{B,C,A}是X和Y的一个公共子序列,但它不是X和Y的一个最长公共子序列。序列{B,C,B,A}也是X和Y的一个公共子序列,它的长度为4,而且它是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。 最长公共
Description
一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X={A,B,C,B,D,B,A},Y={B,D,C,A,B,A},则序列{B,C,A}是X和Y的一个公共子序列,但它不是X和Y的一个最长公共子序列。序列{B,C,B,A}也是X和Y的一个公共子序列,它的长度为4,而且它是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。 最长公共子序列问题就是给定两个序列X={x1,x2,...xm}和Y={y1,y2,...yn},找出X和Y的一个最长公共子序列。
Input
输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有C行数据,每组测试数据占1行,它由2个给定序列的字符串组成,两个字符串之间用空格隔开.
Output
你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的最长公共子序列长度。
Sample Input
1
ABCBDBA BDCABA
Sample Output
4
Pebble Merging 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。
Description
在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。
编程任务:
对于给定n堆石子,编程计算合并成一堆的最小得分和最大得分。
Input
输入由多组测试数据组成。
每组测试数据输入的第1 行是正整数n,1≤n≤100,表示有n堆石子。第二行有n个数,分别表示每堆石子的个数。
Output
对应每组输入,输出的第1 行中的数是最小得分;第2 行中的数是最大得分。
Sample Input
4
4 4 5 9
Sample Output
Hint
43
54
Minimal m Sums 给定n 个整数组成的序列,现在要求将序列分割为m 段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?
Description
给定n 个整数组成的序列,现在要求将序列分割为m 段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?
编程任务:
给定n 个整数组成的序列,编程计算该序列的最优m 段分割,使m 段子序列的和的最大值达到最小。
Input
输入由多组测试数据组成。
每组测试数据输入的第1行中有2个正整数n和m。正整数n是序列的长度;正整数m是分割的段数。接下来的一行中有n个整数。
Output
对应每组输入,输出的每行是计算出的m段子序列的和的最大值的最小值。
Sample Input
1 1
10
Sample Output
10
矩阵连乘问题 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
Description
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
Input
输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个矩阵连乘,接下来一行有n+1个数,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开.
Output
你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数.
Sample Input
1
3
10 100 5 50
Sample Output
7500
Integer Factorization 对于给定的正整数n,编程计算n共有多少种不同的分解式。
问题描述:
大于1 的正整数n可以分解为:n=X1*X2*…*Xm。
例如,当n=12 时,共有8 种不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3。
编程任务:
对于给定的正整数n,编程计算n共有多少种不同的分解式。
邮局选址问题 给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
Description
问题描述:
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:
给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
Input
输入由多组测试数据组成。
每组测试数据输入的第1 行是居民点数n,1≤n≤10000。接下来n 行是居民点的位置,每行2 个整数x 和y,-10000≤x,y≤10000。
Output
对应每组输入,输出的第1 行中的数是n 个居民点到邮局的距离总和的最小值。
Sample Input
5
1 2
2 2
1 3
3 -2
3 3
Sample Output
10
Permutation with Repetition R={ r1,r2,… ,rn }是要进行排列的n 个元素。其中元素r1,r2,… ,rn可能相同。试设计一个算法,列出R的所有不同排列。
Description
R={ r1,r2,… ,rn }是要进行排列的n 个元素。其中元素r1,r2,… ,rn可能相同。试设计一个算法,列出R的所有不同排列。
编程任务:给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
Input
输入由多组测试数据组成。每组测试数据的第1 行是元素个数n,1 <= n <= 500。接下来的1 行是待排列的n 个元素。
Output
对应每组输入,将计算出的n 个元素的所有不同排列输出,每种排列单独一行。最后1 行中的数是排列总数。
Sample Input
4
aacc
Sample Output
aacc
acac
acca
caac
caca
ccaa
6
Search Number 科研调查时得到了n个自然数,每个数均不超过1500000000。已知不相同的数不超过10000个,现在需要在其中查找某个自然数,如找到则输出并统计这个自然数出现的次数,如没找到则输出NO。
Description
科研调查时得到了n个自然数,每个数均不超过1500000000。已知不相同的数不超过10000个,现在需要在其中查找某个自然数,如找到则输出并统计这个自然数出现的次数,如没找到则输出NO。
Input
输入由多组测试数据组成。
每组测试数据输入包含n+1行;
第一行是两个整数n和x,n表示自然数的个数,x表示要查找的自然数,两者之间用空格隔开;
第2至n+1每行一个自然数。
Output
对应每组输入,如果查找到x,则每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开;如果没有查找到x,则每行输出NO.
Sample Input
8 100
2
4
2
4
5
100
2
100
8 3
2
4
2
4
5
100
2
100
Sample Output
100 2
NO
租用游艇问题 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1≤i<j≤n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。
Description
长江游艇俱乐部在长江上设置了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
输入由多组测试数据组成。
每组测试数据输入的第1 行中有1 个正整数n(n≤200),表示有n个游艇出租站。接下来的n-1 行是r(i,j),1≤i<j≤n。
Output
对应每组输入,输出的每行是计算出的从游艇出租站1 到游艇出租站n所需的最少租金。
Sample Input
3
5 15
7
Sample Output
12
最优装载 有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
Description
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
编程任务:
对于给定的n个集装箱和轮船的载重量C,编程计算装入最多时的集装箱个数。
Input
输入由多组测试数据组成。
每组测试数据输入的第1行中有2个正整数n和C。正整数n是集装箱个数;正整数C是轮船的载重量。接下来的一行中有n个整数,分别表示n个集装箱的重量,它们之间用空格分隔。
Output
对应每组输入,输出的每行是计算出的装入最多时的集装箱个数。
Sample Input
4 5
3 5 2 1
Sample Output
2
编辑距离问题 对于给定的字符串A和字符串B,编程计算其编辑距离d(A,B)。
设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。这里所说的字符操作包括
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B 所用的最少字符操作数称为字符串A到B 的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。
编程任务:
对于给定的字符串A和字符串B,编程计算其编辑距离d(A,B)。
整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。
Description
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。
例如正整数6有如下11种不同的划分:
6;
5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
Input
输入包含n+1行;
第一行是一个整数n,表示有n个测试用例;
第2至n+1每行一个正整数。
Output
对应每组输入,输出正整数n的不同划分个数。
Sample Input
2
5
6
Sample Output
7
11
双色Hanoi塔问题 对于给定的正整数n,编程计算最优移动方案
A、B、C 是3个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上, 由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则(1):每次只能移动1个圆盘;
规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):任何时刻都不允许将同色圆盘叠在一起;
规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。
试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。
输油管道问题 编程计算各油井到主管道之间的输油管道最小长度总和
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?
一本书的页码从自然数1 开始顺序编码直到自然数n。
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
活动安排问题 贪心算法
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)
编程任务:
对于给定的k个待安排的活动,编程计算使用最少会场的时间表。