算法设计与分析
何患现在@何惧将来
这个作者很懒,什么都没留下…
展开
-
7-2 N个数求和
7-2 N个数求和本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。输入样例1:52/5 4/15 1/30 -2/60 8/3输出样例1:3 1/3输入样例2:24/3 2/3输出样例2:2输入样例3:31/3原创 2021-12-19 22:29:17 · 242 阅读 · 0 评论 -
工作分配问题
工作分配问题问题描述:设有n件工作分配给n个人。将工作i分配给第j个人需要支付的劳务费为cij,请设计算法,为每个人都分配1件不同的工作,并使得总劳务费达到最小。实现提示:该问题的解空间是一棵排列树,可用搜索排列树的回溯框架实现。输入格式:输入数据的第一行为1 个正整数n (1≤n≤20),表示工作的数量,随后输入n行,每行n个数,表示相应的劳务费。输入样例:310 2 32 3 43 4 5输出样例:9import java.util.Scanner;pu原创 2021-12-14 22:50:58 · 290 阅读 · 0 评论 -
子集和问题
子集和问题问题描述:给定集合S,S中有n个正整数,M是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中各元素之和等于M。请设计回溯法求解子集和问题,如果问题无解,输出“No Solution”问题有解,则输出满足子集S1中各元素的值。import java.io.*;@SuppressWarnings("all")public class subset_sum_problem {//子集和问题--回溯法 static int sum = 0; static原创 2021-12-14 22:50:25 · 117 阅读 · 0 评论 -
整数变换问题
整数变换问题描述:整数i的两种变换定义为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k6dpn4EV-1639493352658)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)],[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZqZQHftH-1639493352661)(file:///C:/Users/86152/AppDat原创 2021-12-14 22:50:00 · 224 阅读 · 0 评论 -
最大k乘积问题
问题描述:设X是一个n位十进制整数,如果将X划分为K段,则可得到K个整数,这K个整数的乘积称为X的一个K乘积。请设计算法并编程实现,对于给定的X 和K,求出X的最大K乘积。输入:X,K,n输出:X的最大K乘积。实现提示:设f(s,t)是X从第s位开始的t位数字组成的十进制数,t(i,j)表示前 i 位数分成 j 段的最大乘积,则状态转移方程为:t(i,j) = max{ t(k,j-1) * f(k,i-k) } (1<=k<i)测试用例:421234原创 2021-12-14 22:48:40 · 211 阅读 · 0 评论 -
最大子段和
最大子段和给定由n个整数(可能有负整数)组成的序列(a1,a2,…,an),最大子段和问题要求该序列形如[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3QvnwfjV-1639493275486)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20211213153243081.png)]的最大值(1<=i<=j<=n),当序列中所有整数均为负整数时,其最大子段和为0。@原创 2021-12-14 22:48:05 · 137 阅读 · 0 评论 -
矩阵连乘问题 动态规划
矩阵连乘问题在科学计算中经常要计算矩阵的乘积。矩阵A和B可乘的条件是矩阵A的列数等于矩阵B的行数。若A是一个p×q的矩阵,B是一个q×r的矩阵,则其乘积C=AB是一个p×r的矩阵。由该公式知计算C=AB总共需要pqr次的数乘。其标准计算公式为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52HGaeO4-1639391368981)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_ima原创 2021-12-14 22:47:35 · 98 阅读 · 0 评论 -
最长公共子序列 动态规划
最长公共子序列 动态规划若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,原创 2021-12-13 18:29:06 · 775 阅读 · 0 评论 -
多机调度问题 贪心算法
多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业要求:分别采用以下两种贪心策略实现算法求解,对比实验结果,分析哪种贪心策略更适合应用于多机调度问题。最长处理时间作业优先的贪心选择策略。最短处理时间作业优先的贪心选择策略。至少采用两组实验数据进行实验,请参考实验数据一,自己再设计一组实验数据。实验数据一:7个独立的作业由3台机器加工处理,各作原创 2021-12-13 18:28:32 · 2318 阅读 · 0 评论 -
最优分解问题 贪心算法
最优分解问题问题描述:设n是一个正整数,要求将n分解为若干互不相同的自然数之和,且这些自然数的乘积最大。输入:正整数n输出:计算的最大乘积。如输入10,则输出30.提示:若a+b的值为一个常量,则a-b的绝对值越小,ab值越大。贪心策略:将n分成从2开始的连续自然数之和,如果最后剩下一个数,则将此数在后项优先的方式下均匀地分给前面各项。import java.util.Scanner;public class Optimal_decomposition_proble原创 2021-12-13 18:27:58 · 657 阅读 · 0 评论 -
删数问题 贪心算法
删数问题描述:给定一个高精度正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数。对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小。应用贪心算法设计求解 设计要点操作对象为n位高精度数,存储在数组a中。在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。每次删除一个数字,选择一个使剩下的数最小的数字作为删除对象。当k=1时,对于n位数构成的数删除哪一位,使得剩下的数据最小。删除满足如下条件的a[i]:它是第一个a[i]>a[i原创 2021-12-13 18:27:25 · 346 阅读 · 0 评论 -
最优服务次序问题 贪心算法
最优服务次序问题问题描述:设有 n个顾客同时等待一项服务,顾客i需要的服务时间为ti,(1<=i<=n)。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?(平均等待时间是n个顾客等待服务时间总和除以n)输入:第一行为一个正整数n,表示有n个顾客第二行为n个正整数,表示n个顾客需要的服务时间输出:最小平均等待时间。import java.util.Arrays;import java.util.Scanner;public class Optimal_se原创 2021-12-13 18:26:53 · 678 阅读 · 0 评论 -
棋盘覆盖问题
棋盘覆盖问题输入:棋盘大小、特殊方格的行号和列号输出:基本要求:以相同的数字表示一个L型骨牌,输出棋盘中每个方格对应的数字。扩展部分:以图示的方法显示棋盘,以不同的颜色区别L型骨牌。import java.util.Scanner;public class Chessboard_coverage_problem {//棋盘覆盖问题 分治 public static void main(String args[]) { int size = 0,jx = 0,jy原创 2021-12-13 18:26:22 · 195 阅读 · 0 评论 -
半数集问题
半数集问题问题描述:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:(1) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-psaYtobW-1639391125334)(file:///C:/Users/86152/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif)];(2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(3) 按此规则进行处理,直到不能再添加自然数为止原创 2021-12-13 18:26:00 · 92 阅读 · 0 评论 -
找出两数组的中位数 O(log n ) 分治与递归
设X[0:n - 1 ] 和 Y[0:n - 1 ] 为两个数组,每个数组含有 n 个已经 排好序的数,试设计一个O(log n ) 时间的算法,找出X 和 Y 的 2n个数的中位数public class Median_of_two_sorted_arrays {// public static void main(String args[]){ // int []arr1 = {1,4,7,9}; // int []arr2 = {原创 2021-12-13 18:25:11 · 312 阅读 · 0 评论 -
Fibonacci数列 递归与分治
Fibonacci数列无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mfsZSW9z-1639391007775)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20211212181754705.png)]第n个Fibonacci数可递归地计算如下:int fibonacci(原创 2021-12-13 18:24:05 · 138 阅读 · 0 评论 -
最大子段和问题
最大子段和问题描述:给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20输入格式:第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。输出格式:输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。输入样例:6-2 11 -4 13 -5 -2输出样例:202原创 2021-12-13 18:22:59 · 67 阅读 · 0 评论 -
输出所有可能的五位数
由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。/** 3. 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数* */public class test { public static void main(String args[]) {//穷举 int a,b,c,d,e;//万 千 百 十 个 for(a=1;a<=4;a++){原创 2021-12-12 23:13:42 · 313 阅读 · 0 评论 -
排序算法效率比较
排序算法效率比较。编程实现以下几种不同的排序算法(以升序为例):冒泡排序、选择排序、 希尔排序、快速排序,比较不同的排序过程的运行时间。具体要求:为了消除数据之间差异导致排序效果的影响,使用相同的数组进行排序,方法为:首先创建一个数组,数组长度至少为100000,数组元素取值范围在[0, 100000]之间的随机正整数,并将这个数组复制4份,分别用不同的排序算法进行排序。记录不同排序算法的运行时间。对完全逆序的情况进行测试,将待排序数组赋值为逆序,即与最终排序要求完全相反。im原创 2021-12-12 23:12:45 · 99 阅读 · 0 评论 -
求两个整数的最大公约数
分别用穷举法和欧几里德算法实现求两个整数的最大公约数,并比较算法的效率。import java.util.Scanner;public class greatest_common_divisor { public static void main(String []args){ Scanner scanner = new Scanner(System.in); System.out.println("请输入两个整数"); int a = 0, b原创 2021-12-12 23:11:55 · 68 阅读 · 0 评论 -
子集和问题 回溯
子集和问题给定n个不同的正整数集合w=(w1,w2,…,wn)和一个正数W,要求找出w的子集s,使该子集中所有元素的和为W。输入格式:第一行输入n和W,第二行依次输入n个数。输出格式:每行输出一个符合要求的子集。输入样例:4 3111 13 24 7输出样例:11 13 724 7import java.io.*;@SuppressWarnings("all")public class subset_sum_problem {//子集和问题--回溯法原创 2021-12-12 09:06:15 · 416 阅读 · 0 评论 -
0/1背包问题 回溯
0/1背包问题描述:0/1背包问题。给定一载重量为W的背包及n个重量为wi、价值为vi的物体,1≤i≤n,要求而且重量和恰好为W具有最大的价值。输入格式:第一行输入背包载重量W及背包个数n,再依次输入n行,每行为背包重量wi和价值vi。输出格式:第一行输出装入背包内的物体编号(末尾有空格),若没有任何物品能装入,输出: No,第二行输出背包内的物体总价值。输入样例:5 102 62 36 55 44 6输出样例1 2 515输入样例:2 1011原创 2021-12-12 09:05:45 · 872 阅读 · 0 评论 -
回溯算法_调度问题
回溯算法_最佳调度问题描述:假设有n(n<=20)个任务由k(k<=20)个可并行工作的机器完成。完成任务i需要的时间为ti。 试设计一个算法,对任意给定的整数n和k,以及完成任务i 需要的时间为ti ,i=1~n。计算完成这n个任务的最佳调度,使得完成全部任务的时间最早。输入格式:输入数据的第一行有2 个正整数n和k。第2 行的n个正整数是完成n个任务需要的时间。输出格式:将计算出的完成全部任务的最早时间输出到屏幕。输入样例:7 32 14 4 16 6 5 3原创 2021-12-12 09:00:49 · 180 阅读 · 0 评论 -
排序算法效率比较
排序算法效率比较。编程实现以下几种不同的排序算法(以升序为例):冒泡排序、选择排序、 希尔排序、快速排序,比较不同的排序过程的运行时间。具体要求:为了消除数据之间差异导致排序效果的影响,使用相同的数组进行排序,方法为:首先创建一个数组,数组长度至少为100000,数组元素取值范围在[0, 100000]之间的随机正整数,并将这个数组复制4份,分别用不同的排序算法进行排序。记录不同排序算法的运行时间。对完全逆序的情况进行测试,将待排序数组赋值为逆序,即与最终排序要求完全相反。im原创 2021-12-12 08:54:53 · 252 阅读 · 0 评论 -
输出可能的五位数
由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。/** 3. 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数* */public class test { public static void main(String args[]) {//穷举 int a,b,c,d,e;//万 千 百 十 个 for(a=1;a<=4;a++){原创 2021-12-12 08:54:10 · 184 阅读 · 0 评论 -
最大子段和问题
最大子段和问题描述:给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20输入格式:第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。输出格式:输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。输入样例:6-2 11 -4 13 -5 -2输出样例:202原创 2021-12-12 08:52:41 · 62 阅读 · 0 评论 -
活动选择问题 贪心算法
活动选择问题描述:假定一个有n个活动(activity)的集合S={a1,a2,…,a**n},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动a**i都有一个开始时间s**i和一个结束时间f**i,其中0<=s**i<f**i<=32767。如果被选中,任务a**i发生在半开时间区间[s**i,f**i)期间。如果两个活动a**i和a**j满足[s**i,f**i)和[s**j,f**j)不重叠,则称它们是兼容的。也就说,若s**i&g原创 2021-12-10 20:38:52 · 373 阅读 · 0 评论 -
汽车加油问题 贪心算法
汽车加油问题描述:题目来源:王晓东《算法设计与分析》一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。输入格式:第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。输出格式:输出最少加油次数。如果无原创 2021-12-10 20:38:16 · 552 阅读 · 0 评论 -
月饼问题 贪心算法
月饼描述:月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿原创 2021-12-10 16:31:32 · 160 阅读 · 0 评论 -
装箱问题 贪心算法
装箱问题描述:假设有N项物品,大小分别为s1、s2、…、s**i、…、s**N,其中s**i为满足1≤s**i≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数s**i(1≤s**i≤100,表示第i项物品的大小)。输出格式:原创 2021-12-10 16:30:50 · 430 阅读 · 0 评论 -
求解矩阵最小路径和问题 动态规划
求解矩阵最小路径和问题描述:给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。求所有路径和中最小路径和。输入格式:首先输入行数m及列数n,接下来输入m行,每行n个数。输出格式:输出第一行为最小路径(假定测试数据中的最小路径唯一),第2行为最小路径和。输入样例:4 41 3 5 98 1 3 45 0 6 18 8 4 0输出样例:1 3 1 0 6 1 012149原创 2021-12-10 16:30:19 · 2652 阅读 · 0 评论 -
石子合并 动态规划
石子合并描述:在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出一个算法,计算出将 N 堆石子合并成 1 堆的最小得分和最大得分。输入格式:数据的第 1 行是正整数 N ,表示有 N 堆石子。第 2 行有 N 个整数,第 i 个整数 a**i 表示第 i 堆石子的个数。输出格式:输出共 2 行,第 1 行为最小得分,第 2 行为最大得分。输入样例:44 5 9原创 2021-12-10 16:29:42 · 522 阅读 · 0 评论 -
回文串问题_动态规划
描述:一个字符串,如果从左到右读和从右到左读是完全一样的,比如"aba",我们称其为回文串。现在给你一个字符串,可在任意位置添加字符,求最少添加几个字符,才能使其变成一个回文串。输入格式:任意给定的一个字符串,其长度不超过1000.输出格式:能变成回文串所需添加的最少字符数。输入样例:Ab3bdAbb输出样例:21import java.util.Scanner;@SuppressWarnings("all")public class Palindro原创 2021-12-09 23:08:39 · 200 阅读 · 0 评论 -
0-1背包_动态规划
0-1背包描述:给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。输入格式:共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。输出格式:输出装入背包中物原创 2021-12-09 23:07:40 · 64 阅读 · 0 评论 -
分形的递归输出
描述:分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。输入格式:输入一系列度,每行给出一个不大于7的正整数。输入的最后一行以-1表示输入结束输出格式:对于每个用例,输出用’X’标记的盒状分形。**在每个测试用例后输出包含一个短划线“-”的一行。输入样例:1234-1输出样例:XX XXX XX X X XX XX X原创 2021-12-08 22:28:12 · 186 阅读 · 0 评论 -
循环日程表
描述:设有N个选手进行循环比赛,其中N=2M,要求每名选手要与其他N−1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N−1天,要求每天没有选手轮空。输入格式:输入:M(M<=7)。输出格式:输出:表格形式的比赛安排表。一行各数据间用一个空格隔开。输入样例:3输出样例:1 2 3 4 5 6 7 82 1 4 3 6 5 8 73 4 1 2 7 8 5 64 3 2 1 8 7 6 55 6 7 8 1 2 3 46 5 8 7 2 1 4 37原创 2021-12-08 22:26:54 · 82 阅读 · 0 评论 -
改写二分搜索算法
描述:题目来源:《计算机算法设计与分析》,王晓东设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。输入格式:输入有两行:第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。输出格式:输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-原创 2021-12-08 22:26:15 · 104 阅读 · 0 评论 -
二分查找算法
描述:输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。输入格式:输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。输出格式:输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。输入样例:41 2 3 41输出样例:02import java.util.Scanner;@SuppressWarn原创 2021-12-08 22:23:53 · 113 阅读 · 0 评论