![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法题目总结
此杭非彼航
凡是过往,皆为序章
展开
-
矩阵的最小路径之和(动态规划法)
矩阵的最小路径之和题目答案题目给定一个包含非负整数的 m x n 表格 ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。m输入格式:第一行输入表格的行m和列n,空格分隔。m,n均小于等于100第二行开始,按行输入表格的非负整数。输出格式:最小的路径之和。输入样例:在这里给出一组输入。例如:3 31 3 11 5 14 2 1输出样例:在这里给出相应的输出。例如:7答案#include<iostream>原创 2021-06-17 13:48:40 · 1665 阅读 · 15 评论 -
切原木问题(动态规划法)
切原木问题题目答案参考题目给定一根长度为N米的原木;另有一个分段价格表,给出长度L1,L2,…Li,…Lk米所对应的价格P1,P2…Pk(Li,Pi均为正整数),求切割原木分段出售所能获得的最大收益。 例如,根据下面给出的价格表,若要出售一段8米长的原木,最优解是将其切割为2米和6米的两段,这样可以获得最大收益=L2+L6=5+17=22。而若要出售一段3米长的原木,最优解是根本不要切割,直接售出。输入格式:首行输入N,k,紧接着第二行为k个Li(递增有序)和第三行对应的k个Pi值。 (0<原创 2021-06-16 21:47:51 · 1684 阅读 · 4 评论 -
最长公共子序列长度(动态规划法)
最长公共子序列长度题目题目求两个字符串的最长公共子序列长度。输入格式:输入长度≤100的两个字符串。输出格式:输出两个字符串的最长公共子序列长度。输入样例1:ABCBDABBDCABA输出样例1:4输入样例2:ABACDEFPGHIK输出样例2:0...原创 2021-06-16 21:33:22 · 837 阅读 · 2 评论 -
单调递增最长子序列(动态规划法)
单调递增最长子序列题目答案题目设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。输入格式:输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开输出格式:最长单调递增子序列的长度输入样例:在这里给出一组输入。例如:51 3 5 2 9输出样例:在这里给出相应的输出。例如:4答案#include<bits/stdc++.h>using namespace std;int main(){ int n;原创 2021-06-16 21:18:25 · 756 阅读 · 1 评论 -
主元素问题(概率算法)
主元素问题题目答案题目设T[n]是一个含有n个元素的数组,x是数组T的一个元素。如果数组中有一半以上的元素与x相同,则称x是数组T的主元素。 例,在T[7]={3,2,3,3,3,3,1}中,存在主元素。输入格式:第1行,输入数组元素个数n(0<n<100)第2行,输入n个整数元素,用空格分隔输出格式:(不)存在主元素输入样例:在这里给出一组输入。例如:73 3 3 3 3 3 1输出样例:在这里给出相应的输出。例如:存在主元素答案#include<i原创 2021-06-11 08:49:45 · 811 阅读 · 10 评论 -
求PI的近似值(近似算法)
题目求PI的近似值 (30 分)用正多边形逼近法求π的近似值。 用圆内接正多边形的边长和半径之间的关系,不断将边数翻倍并求出边长,重复这一过程,正多边形的边长就逐渐逼近圆的周长,只要圆内接正多边形的边数足够多,就可以求得所需精度的π值。 从正六边形开始。简单起见,设单位圆的半径是1,则单位圆的圆周长是2×π,设单位圆内接正i边形的边长为2b,边数加倍后正2i边形的边长为x,则:输入格式:输入1-10的数k(圆正接多边形边数n=6*2^(k-1))输出格式:圆内接正多边形的边数n和PI值,PI的原创 2021-06-11 08:47:44 · 5004 阅读 · 3 评论 -
背包问题(分支限界法)
背包问题(分支限界法)题目答案注意题目使用分支限界法求解0-1背包问题。 给定n(n<=10)种物品和一个容量为c的背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=100)。 在装入背包的物品时,对每种物品只有两个选择:装入或不装入。 如何选择装入背包中的物品,使得装入背包中物品的总价值最大?输入格式:第1行,输入物品个数n和背包容量c 第2行-n+1行,每个物品的重量和价值输出格式:背包能获得的最大价值输入样例:在这里给出一组输入。例如:5 102 62 3原创 2021-06-04 10:16:38 · 2270 阅读 · 1 评论 -
0-1背包问题(回溯法)
0-1背包问题题目答案注意题目使用回溯法求解0-1背包问题。 给定n(n<=10)种物品和一个容量为c的背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=100)。 在装入背包的物品时,对每种物品只有两个选择:装入或不装入。 如何选择装入背包中的物品,使得装入背包中物品的总价值最大?输入格式:第1行,输入物品个数n和背包容量c 第2行-n+1行,每个物品的重量和价值输出格式:第1行:背包能获得的最大价值 第2行:装入背包的物品编号序列(物品编号从1开始,每个编号后面跟1个空原创 2021-06-03 16:12:23 · 1054 阅读 · 6 评论 -
八皇后问题(回溯法)
八皇后问题题目答案注意题目会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。。输入格式:第1原创 2021-05-28 09:15:15 · 604 阅读 · 2 评论 -
特定条件的八皇后问题(回溯法)
特定条件的八皇后问题题目答案题目在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。 要求第一行的皇后放在指定列,问有多少种摆法?输入格式:第一行的皇后放的列输出格式:解的个数输入样例:在这里给出一组输入。例如:1输出样例:在这里给出相应的输出。例如:4答案#include<iostream原创 2021-05-28 09:12:52 · 2475 阅读 · 8 评论 -
回溯法——素数环(两种方法解题)
素数环题目答案第一种方法(推荐)第二种方法注意题目把整数{1,2,…,10}填写到一个环中,要求每个整数只填写一次,并且相邻的两个整数之和是一个素数。输入格式:输入整数n输出格式:输出n个序列,要求这些序列是1开头,10个整数字典序排列。 提示:每行最后1个数字后有一个空格。输入样例:在这里给出一组输入。例如:1输出样例:在这里给出相应的输出。例如:1 2 3 4 7 6 5 8 9 10 答案第一种方法(推荐)#include<iostream>#inclu原创 2021-05-27 21:41:40 · 5601 阅读 · 5 评论 -
子集和问题(回溯法)
子集和问题题目答案参考题目设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法,并输出利用回溯法在搜索树(按输入顺序建立)中找到的第一个解。输入格式:输入数据第1行有2个正整数n和c,n表示S的大小,c是子集和的目标值。接下来的1行中,有n个正整数,表示集合S中的元素。 是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。输出格式:输出利用回溯法找到的第一个解,以空格分原创 2021-05-20 17:34:02 · 4521 阅读 · 4 评论 -
最佳调度问题(回溯法)
最佳调度问题题目答案参考题目假设有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 1原创 2021-05-20 16:08:11 · 3569 阅读 · 3 评论 -
桥本分数(回溯法)
桥本分数题目答案注意题目桥本分数。将1,2,3,4,5,6,7,8,9填入如下图的9个方格中,使得等式成立(要求不得重复)。 用回溯法设计求解桥本分数的算法。输入格式:整数n(n<=10)输出格式:按照字典序,输出前n个等式输入样例:在这里给出一组输入。例如:1输出样例:在这里给出相应的输出。例如:1/26+5/78=4/39答案#include<iostream>using namespace std;int n=9,vis[10],n1;int原创 2021-05-20 15:28:23 · 4187 阅读 · 3 评论 -
数字等式游戏(注意数据类型!!!)
数字等式游戏题目答案注意题目数字等式游戏。将数字1-9填入下图,使得等式成立。 要求每个数字只能使用一次,且数字1不能穿在乘法和除法的一位数中,即排除乘数或除数是1的情况。输入格式:输入正整数n(n<=3)输出格式:输出前n个成立的等式。多个等式分行输出。输入样例:在这里给出一组输入。例如:1输出样例:在这里给出相应的输出。例如:12*4+376/8-95=0答案#include<iostream>using namespace std;int n=9原创 2021-05-20 14:57:23 · 512 阅读 · 2 评论 -
输出全排列(回溯法)
输出全排列题目答案注意题目请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。输入格式:输入给出正整数n(<10)。输出格式:输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a1 ,a2 ,⋯,an 排在序列b1 ,b2 ,⋯,bn 之前,如果存在k使得a1 =b1 ,⋯,ak =bk 并且 ak+1 <bk+1 。原创 2021-05-20 13:39:43 · 1122 阅读 · 3 评论 -
会场安排问题(网上的其它答案都无法通过PTA?我这个答案肯定能过!!!)
会场安排问题题目答案参考题目题目来源:王晓东《算法设计与分析》假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的 贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个 顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小 会场数。)输入格式:第一行有 1 个正整数k,表示有 k个待安排的活动。 接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间 以 0 点开始的分钟计。输出格式原创 2021-05-14 15:01:58 · 557 阅读 · 6 评论 -
PTA——活动安排问题
活动安排问题题目答案注意题目活动安排问题要求在所给的活动集合中选出最大的相容活动子集。输入格式:第1行输入活动数k 第2行输入k个活动的开始时间 第3行输入k个活动的结束时间输出格式:最大相容的活动数输入样例:在这里给出一组输入。例如:31 3 04 5 6输出样例:在这里给出相应的输出。例如:1答案#include<iostream>#include<algorithm>using namespace std;struct Node{ i原创 2021-05-14 13:18:13 · 517 阅读 · 2 评论 -
PTA——月饼(贪心法)
月饼题目答案注意题目月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94原创 2021-05-14 12:41:24 · 431 阅读 · 1 评论 -
装箱问题(贪心法)
装箱问题题目答案注意题目假设有N项物品,大小分别为s1 、s2 、…、si 、…、sN ,其中si 为满足1≤si ≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数si (1≤s≤100,表示第i原创 2021-05-14 10:45:36 · 361 阅读 · 4 评论 -
埃及分数(附带注释)
埃及分数题目答案题目埃及分数:分子为1的分数。 将输入的分数转换为埃及分数和的形式。要求用最少的埃及分数之和表示。输入格式:第1行输入分子m和分母n输出格式:首先原样输出该分数,然后输出等于号,再输出它的埃及分数的加法之和。输入样例1:在这里给出一组输入。例如:7 8输出样例1:在这里给出相应的输出。例如:7/8=1/2+1/3+1/24输入样例2:在这里给出一组输入。例如:11 7输出样例2:在这里给出相应的输出。例如:11/7=1/1+1/2+1/14答案原创 2021-05-13 15:36:59 · 2773 阅读 · 4 评论 -
PTA——编辑距离问题(帮你捋顺思路)
编辑距离问题题目答案参考思路从左侧(i,j-1)过来的“插入”方法从上方(i-1,j)过来的“删除”方法从左上方(i-1,j-1)过来的“修改字符”方法题目有样本P和文本T两个字符串。要用最少的字符操作将文本T转换为样本P。 这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。 将T变换为字P所用的最少字符操作数称为T到 P的最短编辑距离,记为D(T,P)。输入格式:第一行是样本P,第二行是文本T。长度都不超过2000个字符。输出格式:输出编辑距离原创 2021-05-13 14:16:23 · 1503 阅读 · 6 评论 -
矩阵的最小路径之和(动态规划法)
矩阵的最小路径之和题目答案题目答案#include<iostream>#include<algorithm>#include<cstring>#include<stack>using namespace std;int main(){ int m,n; cin>>m>>n; int map[m][n]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) ci原创 2021-04-29 21:30:35 · 315 阅读 · 2 评论 -
0-1背包(动态规划法)
0-1背包题目答案参考题目答案#include<iostream>#include<algorithm>#include<cstring>#include<stack>using namespace std;int main(){ int n,size; cin>>n>>size; int weight[n+1],price[n+1],dp[105][1005]; for(int i=1;i<=n;i原创 2021-04-29 21:18:47 · 110 阅读 · 2 评论 -
切原木问题(动态规划法DP)
切原木问题题目答案题目答案#include<iostream>#include<cstring>using namespace std;int main(){ int num,k; cin>>num>>k; int len[k],init_price[10000],max_price[10000]; //init_price[i]表示i米对应的初始价钱,max_price[i]表示切 i米的最大收益 memset(init_pric原创 2021-04-29 12:50:03 · 761 阅读 · 2 评论 -
凑零钱(使用递归)
凑零钱题目答案注意题目答案#include<iostream>using namespace std;int n,amount;int a[10000],b[10000];int check(int start,int last,int sum,int cnt){ if(start>last) return -1; int tmp=amount-sum; sum+=tmp-tmp%a[last]; cnt+=tmp/a[last]; if(sum==amoun原创 2021-04-29 10:34:55 · 269 阅读 · 2 评论 -
Dijkstra算法代码
文章目录代码说明代码#include<iostream>#include<cstring>using namespace std;#define Inf 0x3f3f3f3fint map[1001][1001];int vis[1001],dis[1001];int n,m;void init(){ memset(map,Inf,sizeof map); for(int i=1;i<=n;i++) map[i][i]=0;}void get原创 2021-04-20 21:51:21 · 299 阅读 · 2 评论 -
斐波那契数列(III)(矩阵快速幂)
斐波那契数列(III)题目答案注意总结题目答案#include<iostream>using namespace std;unsigned long long Pow(unsigned long long n){ unsigned long long a[2][2]={{1,1},{1,0}}; unsigned long long temp[2][2]={{1,0},{0,1}},tmp1,tmp2,tmp3,tmp4; while(n) { if(n&1)原创 2021-04-18 12:08:06 · 675 阅读 · 4 评论 -
斐波那契数列(II)(使用循环而非递归)
斐波那契数列(II)题目答案题目答案#include<iostream>using namespace std;int main(){ int n; cin>>n; int result,tmp,f1=1,f2=1; if(n==1||n==2) tmp=1; else { for(int i=3;i<=n;i++) { tmp=(f1+f2)%998244353; f1=f2; f2=tmp; } result=t原创 2021-04-08 16:08:47 · 437 阅读 · 3 评论 -
找第k小的数(核心逻辑为快速排序)
找第k小的数题目答案题目答案#include<iostream>using namespace std;int partition(int a[],int start,int end){ int l=start,r=end; int tmp=a[l]; while(l<r) { while(l<r&&a[r]>=tmp) r--; a[l]=a[r]; while(l<r&&a[l]<=tmp) l+原创 2021-04-08 16:06:10 · 172 阅读 · 1 评论 -
求乘方的末尾数字(快速幂)
求乘方的末尾数字题目答案快速幂讲解题目答案#include<iostream>using namespace std;int Pow(int a,int b){ int ans=1,base=a; while(b) { if(b&1) ans=ans*base%1000; base=base*base%1000; b>>=1; } return ans;}int main(){ int a,b; cin>>a>&原创 2021-04-08 15:55:06 · 1102 阅读 · 1 评论 -
还在用pow函数做幂运算相关的算法题?快速幂表示不服!
别再用pow函数做算法题了引文快速幂逻辑讲解举例总结快速幂代码讲解最后引文众所周知,pow函数是最简单,也是效率最低的求幂函数。如果不对其进行相应的优化,很多算法题光是从运行时间上就无法通过。我相信大家不是不想用更高效的求幂算法,但苦于不知道。那就不妨继续读下去,我来教大家一个更高效的求幂运算让我们有请——快速幂!!!快速幂逻辑讲解举例假设我们求3的5次方,即底数是3,指数是5首先,我们将5转化为二进制,即101其次,按位将二进制的指数拆解,写成101=20+22所以35=32的0次方+原创 2021-04-08 15:52:16 · 808 阅读 · 2 评论 -
两个有序序列的中位数(减治法版本)
两个有序序列的中位数题目答案分治法版本其它版本(sort函数)举例分析伪代码描述题目答案分治法版本#include<iostream>using namespace std;int SearchMid(int a[],int b[],int n){ int s1=0,e1=n-1,s2=0,e2=n-1; int mid1,mid2; while(s1<e1&&s2<e2) { mid1=(s1+e1)/2; mid2=(s2+e2)原创 2021-04-08 12:40:18 · 290 阅读 · 6 评论 -
算法练习——在有序序列(r1,r2,...,rn)中,存在序号i(1<=i<=n),使得ri=i。请设计一个分治算法找到这个元素。 要求算法在最坏情况下的时间性能为O(logn))
算法练习题目答案注意题目答案#include<iostream>using namespace std;int find(int a[],int left,int right){ if(left==right) { if(a[left]==left) return left; else return -1; } int mid=(left+right)/2; if(a[mid]==mid) return mid; else { if(a[mid]<原创 2021-04-06 15:11:45 · 2621 阅读 · 1 评论 -
整数分解为若干项之和(dfs广度优先遍历)
整数分解为若干项之和题目答案思路题目答案#include<stdio.h>int n,count=0,a[50];void dfs(int number,int n,int location,int sum){ if(sum>n) return; if(sum==n) { printf("%d=",n); for(int i=0;i<location;i++) if(i==0) printf("%d",a[i]); else printf("+%d原创 2021-03-31 20:42:38 · 208 阅读 · 1 评论 -
数组循环右移——使用额外数组太麻烦,三次交换直接搞定!
数组元素循环右移问题题目答案思路讲解最后题目答案#include<stdio.h>#include<algorithm>using namespace std;void Swap(int a[],int left,int right){ for(int i=left;i<=(right+left)/2;i++) swap(a[i],a[left+right-i]);}int main(){ int n,m,i; scanf("%d %d",&a原创 2021-03-26 10:51:42 · 222 阅读 · 2 评论 -
数组循环左移——使用额外数组太麻烦,三次交换直接搞定!
数组循环左移题目答案PTA测试点类似题目题目答案#include<stdio.h>#include<algorithm>using namespace std;void Swap(int a[],int left,int right){ for(int i=left;i<=(right+left)/2;i++) swap(a[i],a[left+right-i]);}int main(){ int n,m,i; scanf("%d %d",&a原创 2021-03-26 12:32:18 · 212 阅读 · 0 评论 -
分治法——最大子列和问题
最大子列和问题题目答案参考题目答案#include<stdio.h>int Max(int a,int b,int c){ if(a>b) { if(a>c) return a; else return c; } else { if(b>c) return b; else return c; }} int apart(int a[],int left,int right){ int left_max,right_max;原创 2021-03-25 21:19:03 · 547 阅读 · 0 评论 -
设计分治算法,求一个数组中的最小元素
设计分治算法,求一个数组中的最小元素题目答案题目答案#include<stdio.h>int result(int a[],int left,int right);int main(){ int n,i,min; scanf("%d",&n); int a[n]; for(i=0;i<n;i++) scanf("%d",&a[i]);; printf("%d",result(a,0,n-1));}int result(int *a,int l原创 2021-03-25 15:17:39 · 593 阅读 · 0 评论 -
理解了KMP算法却不知道代码怎么写?看看这道题你会有收获!(jmu-ds-实现KMP)
jmu-ds-实现KMP序言题目答案注意序言对于KMP算法还有一些疑问的可以跳转到我的这篇文章——看文档、看教材都没搞懂KMP算法?六小时呕心力作,点进来就是血赚!,相信在这篇文章中你会有许多收获!题目答案#include<stdio.h>#include<string.h>void GetNext(char T[],int next[]);int KMP(char S[],char T[]);int main(){ int n,i; scanf("%d"原创 2021-03-22 16:26:05 · 448 阅读 · 0 评论