算法分析与设计学习
记录学习算法分析与设计课程的过程,主要为PTA题
大图书馆的牧羊人
这个作者很懒,什么都没留下…
展开
-
编写函数,获取两段字符串的最长公共子串的长度
1.创建dp数组(算法核心是动态规划)// 创建dp数组 int[][] getDp(char[] arr1,char[] arr2){ int[][] dp = new int[arr1.length][arr2.length]; // 第一列赋值 for (int i = 0; i < arr1.length; i++) { if (arr1[i] == arr2[0]){ dp[i]转载 2021-09-13 11:26:19 · 381 阅读 · 0 评论 -
3. 工作分配问题(回溯法)设有n件工作分配给n个人。。。
问题描述:设有n件工作分配给n个人。将工作i分配给第j个人的费用为cij,请设计算法,为每个人都分配1件不同的工作,并使得总费用达到最小。实现提示:该问题的解空间是一棵排列树,可用搜索排列树的回溯框架实现。输入样例310 2 32 3 43 4 5输出样例9源代码#include<iostream>#include<climits>using namespace std;int work[100];// 工作数组,用于存储工作编号int work原创 2020-12-19 11:49:37 · 5072 阅读 · 0 评论 -
PTA 子集和问题(回溯法):给定集合S,S中有n个正整数,M是一个正整数。...
问题给定集合S,S中有n个正整数,M是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中各元素之和等于M。请设计回溯法求解子集和问题,如果问题无解,输出“No Solution”,问题有解,则输出满足子集S1中各元素的值。输入样例4 3113 24 11 7输出样例13 24 11 724 7详解请看代码注释源代码#include<iostream>using namespace std;int* arr,*result;原创 2020-12-17 17:24:42 · 3326 阅读 · 0 评论 -
贪心算法分析-多机调度问题
多机调度问题利用贪心法设计算法求解如下问题:要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。这个问题是一个NP完全问题,到目前为止还没有一个有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。可以考虑以下的贪心策略:(1)最长处理时间作业优先的贪心选择策略。(2)最短处理时间作业优先的贪心选择策略。(3)作业到达时间优先的贪心选择策略。测试原创 2020-12-08 20:49:41 · 1752 阅读 · 0 评论 -
贪心算法分析 最优分解问题
问题假设有N项物品,大小分别为s1 、s2 、…、si 、…、sN,其中si为满足1≤si≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数si(1≤si ≤100,表示第i项物品的大小)。输出格式:按照输原创 2020-12-07 22:07:53 · 899 阅读 · 1 评论 -
PTA 6 活动选择问题
问题假定一个有n个活动(activity)的集合S={a1 ,a2,…,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动ai都有一个开始时间si和一个结束时间fi其中0<=si <fi<=32767。如果被选中,任务ai发生在半开时间区间[si,fi)期间。如果两个活动ai和aj满足[si ,fi)和[sj,fj)不重叠,则称它们是兼容的。也就说,若si>=fj或sj >=f原创 2020-12-06 18:58:42 · 1210 阅读 · 0 评论 -
PTA 4 看电影
问题终于到周末了,明明是特别喜欢看电影。他想在一天内尽量多的看到完整的多部电影。 现在他把他喜欢的电影的播放时间表给你,希望你能帮他合理安排。输入格式:输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示明明喜欢的电影的总数。 接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个电影的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。 当n=0时,输入结束。输出格式:对于每组输入,输出能完整看到的电影的个数。输入样例:在这里给出一组原创 2020-12-05 22:07:12 · 974 阅读 · 0 评论 -
PTA 3 最优合并问题
问题题目来源:王晓东《算法设计与分析》给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。输入格式:第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。输出格式:输出最多比较次数和最少比较次原创 2020-12-04 22:02:35 · 405 阅读 · 0 评论 -
PTA 1 装箱问题
问题假设有N项物品,大小分别为s1 、s2 、…、si 、…、sN ,其中si 为满足1≤si ≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数si(1≤si≤100,表示第i项物品的大小)。输出原创 2020-11-30 21:57:23 · 224 阅读 · 0 评论 -
算法分析_半数集问题
问题描述:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:(1) n∈set(n);(2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(3) 按此规则进行处理,直到不能再添加自然数为止。例如,set(6)={6,16,26,126,36,136},半数集set(6)中有6个元素。输入:整数n(0<n<1000)输出:半数集set(n)中的元素个数。分析:首先应该明确什么是半数集,半数集就是给定一个数,在这个数的左边添加新的数字(如6,左原创 2020-11-25 23:40:06 · 1537 阅读 · 1 评论 -
n台级阶问题
问题:有n级台阶,可以一步走上一个台阶,也可以一步走上两个台阶,求有多少种不同的走法?分析:每走一次都有两种选择:上一个台阶或者上两个台阶,如下图:即:如果n=1级台阶,方法只有1种如果n=2级台阶,则有2种方法当级数为n>2的时候有以下两种情况:1、第n级台阶时是在n-1级上1级上来的2、第n级台阶时是在n-2级上2级上来的例如:以n等于4为例走完4级台阶共有5种方法故可用递归的方法来实现:def(n)=def(n-1)+def(n-2)(当n大于等于3时,def为递归函原创 2020-11-28 23:05:44 · 551 阅读 · 0 评论 -
PTA 6 循环日程表
问题:设有N个选手进行循环比赛,其中N=2^M ,要求每名选手要与其他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原创 2020-11-22 18:17:09 · 458 阅读 · 0 评论 -
冰雹数(任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1)
冰雹数问题:任意给定一个正整数N,如果是偶数,执行: N / 2如果是奇数,执行: N * 3 + 1生成的新的数字再执行同样的动作,循环往复。通过观察发现,这个数字会一会儿上升到很高,一会儿又降落下来。就这样起起落落的,但最终必会落到“1”这有点像小冰雹粒子在冰雹云中翻滚增长的样子。比如N=99,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1可以看到,N=9的时候,这个“小冰雹”最高冲到了52这个高度。输入格式:一个正整数N原创 2020-11-20 22:49:11 · 3495 阅读 · 1 评论 -
蓝桥杯14年国赛试题——海盗分金币
问题:有5个海盗,相约进行一次帆船比赛。比赛中天气发生突变,他们被冲散了。恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人。第一个人在沙滩上发现了一堆金币。他把金币分成5等份。发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,然后把属于自己的那份拿走。第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,拿走了属于自己的那份。第三,第四,第五人的情况一模一样。等他们到了目的地,都说自己的原创 2020-11-18 19:58:48 · 425 阅读 · 0 评论 -
PTA 1 穷举问题-搬砖
问题:某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块砖,问有多少种搬法?输入格式:输入在一行中给出一个正整数n。输出格式:输出在每一行显示一种方案,按照"men = cnt_m, women = cnt_w, child = cnt_c"的格式,输出男人的数量cnt_m,女人的数量cnt_w,小孩的数量cnt_c。请注意,等号的两侧各有一个空格,逗号的后面也有一个空格。如果找不到符合条件的方案,则输出"None"输入样例:45输出样例:me原创 2020-11-19 23:28:23 · 810 阅读 · 0 评论 -
PTA 5 换硬币
问题:将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?输入格式:输入在一行中给出待换的零钱数额x∈(8,100)。输出格式:要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。输入样例:13输出样例:fen5:2, fen2:1, fen1:1, total:4fen5:原创 2020-11-24 23:36:39 · 203 阅读 · 0 评论 -
PAT 2 百鸡问题扩展-N鸡问题
问题:N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,而且鸡必须整只买,不能劈开买。有几种买法呢?这就是N鸡问题。输入格式:在一行中输入一个正整数N。(N<500)输出格式:在一行中输出两个整数c s,中间用一个空格隔开,表示N元钱买N只鸡共有 c 种买法,且所有买法的公鸡数量之和是 s。如果无解,则 s 为 -1.输入样例1:100输出样例1:4 24输入样例2:1输出样例2:0 -1解决方案:直接上代码。源代码:#inclu原创 2020-11-29 23:11:50 · 1039 阅读 · 0 评论 -
PAT 3 输出全排列
问题:输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。输入格式:一行输入正整数n。输出格式:按字典序输出1到n的全排列。每种排列占一行,数字间无空格。输入样例:在这里给出一组输入。例如:3输出样例:在这里给出相应的输出。例如:123132213231312321解决方案:主要是next_permutation()函数的运用,使用该函数会使得该题简单许多。源代码如下:#include<stdint.h>#i原创 2020-11-17 19:50:52 · 497 阅读 · 0 评论 -
有两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛对手名单。规定A不和J比赛, M不和D及E比赛。列出所有可能的比赛名单。
问题:有两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛对手名单。规定A不和J比赛, M不和D及E比赛。列出所有可能的比赛名单。分析:抽签决定比赛对手,为了找出所有可能的比赛方案,可以假设由甲组成员与选择对手,故在无限制条件的情况下,甲组的每个选手均有5种选择,由此可建立对手池:A:J K L M NB:J K L M NC:J K L M ND:J K L M NE:J K L M N用一个二维数组去存储这五个对手池,即下面代码中的b原创 2020-11-23 19:18:58 · 967 阅读 · 0 评论 -
PAT 最大子段和问题
最大子段和问题给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20输入格式:第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。输出格式:输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。输入样例1:6-2 11 -4 13 -5 -2输出样例1:202 4源代码:pa原创 2020-11-16 18:51:35 · 765 阅读 · 0 评论 -
PAT 5 求前缀表达式的值
前缀表达式的值算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。输入格式:输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。输出格式:输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。*#include<stdio.h>#inc原创 2020-11-15 20:02:03 · 226 阅读 · 0 评论 -
使用C++编写快速排序
#include<stdio.h>#include<iostream>#define MAX 100using namespace std;void quick_sort(int *arr,int left, int right) { if (right < left) return; int l=left; int r=right; int temp = arr[l]; while (l!=r ) {原创 2020-11-13 21:42:44 · 130 阅读 · 0 评论 -
PTA 4 梅森数
梅森数(Mersenne Number)问题形如2^ n−1的素数称为梅森数(Mersenne Number)。例如2^ 2−1=3、2^3−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2^31−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。本题要求编写程序,对任一正整数n(n<20),输出所有不超过2^n−1的梅森数。按从小到大的顺序输出所有不超过2^n−1的梅森数,每行一个。如果完全没有,则输出“None”。源代码#include原创 2020-11-12 20:02:44 · 1468 阅读 · 0 评论 -
PTA 3 跳一跳
问题微信小程序中的跳一跳相信大家都玩过。emmm???只学习不玩游戏?那就吃亏了…好好读题理解吧。 简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。 如果跳到了方块上,但没有跳到方块的中心则获得1分;跳到方块中心时,若上一次的得分为1分或这是本局游戏的第一次跳跃则此次得分为2分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将+2,+4,+6,+8…)。 现在给出一个人跳一跳的全过程,请你求出他本局游戏的得分(按照题目描述的原创 2020-11-11 21:45:58 · 279 阅读 · 0 评论 -
常用算法入门——回溯算法
const int maxn = 20; // 最多20 x 20 个格子const int maxd = maxn * 2 + 1; // 拿来记录状态int vis[3][maxd];// 0表示列,1表示主对角线,2表示次对角线int n; // n 个皇后int index[maxn]; // 第i个皇后所在的列数int cnt; // 统计解答树中结点void init() {memset(vis, 0, sizeof(vis));memset(index, 0, sizeof(转载 2020-11-10 23:12:41 · 540 阅读 · 0 评论 -
转载---贪心算法
转载博主1.贪心算法简介1.1 基本定义在贪婪算法(greedy method) 中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,做出一个最优决策。做出决策所依据的标准称为贪心准则(greedy criterion)。贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法每一步必须满足以下条件: 1、可行的:即它必须满足问题的约束。 2、局部最优:他是当前步骤中所有可行选择中最佳的局部选转载 2020-09-26 21:00:44 · 748 阅读 · 0 评论 -
小明有一张m*n的好习惯记录卡,记录每一天的好习惯目标达成度(数字0-9表示)PTA 666
问题小明有一张m*n的好习惯记录卡,记录每一天的好习惯目标达成度(数字0-9表示)。某天目标完成达成,就在当天的格子里写上数字6,目标没有完全达成就写上一个小于6的数字(0-5),目标超额完成就写上一个大于6的数字(7-9)。记录卡上如果能找到一条长度为3的路径并且路径上的三个数字都大于等于6(这里的路径是指从某个格子出发,可以向左、右、上、下格子移动,并且不能重复经过一个格子),则小明就能得到一个“666”奖励。请你帮小明统计下他总共能得到多少“666”奖励。输入格式:输入第一行给出两个正整数m原创 2020-12-16 16:43:47 · 960 阅读 · 1 评论 -
PTA 4 回溯法解整数拆分
问题将一个正整数拆分成若干个正整数的和。输入格式:一个正整数n输出格式:若干行,每行一个等式(每个数或者等号间都有一个空格,第一个数前没有空格,最后一个数后面没有空格,数与数之间要求非降序排列)。最后一行给出解的总个数输入样例:在这里给出一组输入。例如:4输出样例:在这里给出相应的输出。例如:4 = 1 + 1 + 1 + 14 = 1 + 1 + 24 = 1 + 34 = 2 + 24源代码:#include<iostream>using namesp原创 2020-12-15 11:49:38 · 663 阅读 · 0 评论 -
PTA 3 回溯法解0-1背包问题
问题给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。输入输出格式源代码:#include<iostream>//0-1背包问题using namespace std;struct wuping{ int w;//物品重量 int原创 2020-12-13 18:07:34 · 1624 阅读 · 0 评论