程序基本算法习题解析
elma_tww
这个作者很懒,什么都没留下…
展开
-
程序基本算法习题解析 任意给一个四位数(各位数不完全相同), 各位上的数可组成一个最大数和一个最小数, 它们的差又能组成一个最大数和一个最小数, 直到某一步得到的差将会出现循环重复。
这是《程序基本算法习题解析》中的一道练习题。题目: 任意给一个四位数(各位数不完全相同), 各位上的数可组成一个最大数和一个最小数, 它们的差又能组成一个最大数和一个最小数, 直到某一步得到的差将会出现循环重复。写一个程序统计所有满足以上条件的四位数。// Chapter1_6.cpp : Defines the entry point for the applicati...原创 2018-12-14 13:02:15 · 3059 阅读 · 1 评论 -
程序基本算法习题解析 双递归函数Ackerman,计算A(3,2).
题目:当一个函数及它的变量是由函数自身定义时,称这个函数是双递归函数。双递归函数Ackerman函数定义如下:计算A(3,2)。根据公式很容易写出代码,直接附上:// Chapter7_6.cpp : Defines the entry point for the application.// 双递归函数Ackerman,计算A(3,2).#include "stdaf...原创 2018-12-17 17:10:39 · 1066 阅读 · 0 评论 -
程序基本算法习题解析 用分治法求a^n。
题目:如果n为偶数,则;如果n为奇数,则,其中m为偶数。思路不难,直接附上代码:// Chapter7_7.cpp : Defines the entry point for the application.// 用分治法求a^n。#include "stdafx.h"#include<iostream>using namespace std;int fun...原创 2018-12-17 17:27:58 · 3734 阅读 · 1 评论 -
程序基本算法习题解析 有两个长度相等的已排序数组,采用分治法求合并后的排序数组的中位数
书上举例说明了一下思路:设数组长度为n。假设数组A的中位数为m1,数组B的中位数为m2,例如,arr1[]={1,12,15,26,38},arr2[]={2,13,17,30,45},则m1=15,m2=17。由于m1<m2,可以确定中位数即为下面两个子数组中的中位数:[15,26,38]和[2,13,17]。重复这个步骤,可得m1=26,m2=13,由此得到两个子数组:[15,16]...原创 2018-12-17 21:11:14 · 597 阅读 · 0 评论 -
程序基本算法习题解析 给定由n个整数(可能为负数)组成的序列a1,a2,...,an,求该序列的字段和的最大值。
这是动态规划法中的一道题,感觉很复杂,但是稍后看到程序会惊讶于它的简洁。先附上代码:// Chapter8_4.cpp : Defines the entry point for the application.// 给定由n个整数(可能为负数)组成的序列a1,a2,...,an,求该序列的字段和的最大值。// 当所有整数均为负整数时定义其最大字段和为0。#include "st...原创 2018-12-18 14:18:02 · 18547 阅读 · 3 评论 -
程序基本算法习题解析 用贪心法求解找硬币问题。程序先读入一系列基本币值,然后读入要找的钱数,要求算法找出的硬币个数最少。
思路:先从最大面值的硬币开始找零,当最大面值的硬币大于剩余钱数时,换成稍小面值的硬币,...,直到全部找清。程序如下:// Chapter9_1.cpp : Defines the entry point for the application.// 用贪心法求解找硬币问题。程序先读入一系列基本币值,然后读入要找的钱数,// 要求算法找出的硬币个数最少。#include "s...原创 2018-12-18 15:41:35 · 734 阅读 · 0 评论 -
程序基本算法习题解析 设有n个正整数,将它们连成一排,组成一个最大的多位整数。要求输入n个正整数后,输出连成的最大整数。
例如n=3时,3个整数13,312,343连成的最大整数为34331213;又如n=4时,4个整数7,13,4,246连成的最大整数为7424613.思路:采用贪心策略,先把整数转换为字符串,然后再比较a+b和b+a。如果a+b>b+a,就把a排在b前面,反之把a排在b后面。程序如下:// Chapter9_2.cpp : Defines the entry point f...原创 2018-12-18 19:59:33 · 4624 阅读 · 0 评论 -
程序基本算法习题解析 最优服务次序问题
题目:最优服务次序问题:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1<=i<=n。应如何安排n个顾客的服务次序,才能使平均等待时间最少?平均等待时间是n个顾客等待服务时间的总和除以n。思路:先服务等待时间最少的顾客,因此首先需要对顾客需要的服务时间进行排序,且每个顾客的等待时间除了自身需要的服务时间外,还需加上自己开始被服务前的等待时间(比自己的服务时间短的...原创 2018-12-18 21:53:45 · 2159 阅读 · 0 评论 -
程序基本算法习题解析 回溯法求解图的m可着色判定问题
题目:给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点着不同颜色。思路:首先,需要输入的数据为:顶点数N,颜色数M,邻接矩阵adjMatrix(二维,表示顶点之间的关系,两点间有边相连为1,无边相连为0)。然后依次对各顶点进行着色,对每个顶点的着色规则是:从标号较小的颜色数开始尝试,每选定一种颜色,判断该顶点是否...原创 2018-12-20 15:27:01 · 1664 阅读 · 0 评论 -
程序基本算法习题解析 运用回溯法将1分解成若干个互不相同的单位分数之和。
题目:形如1/a的分数称为单位分数,可以将1分解成若干个互不相同的单位分数之和。如 1= 1/2+1/3+1/9+1/18; 1 = 1/2+1/3+1/10+1/15。这样的分解有无数个。现要求分解为n项且分解后最大的分母不超过30,给出所有不同分解法。代码如下:// Chapter10_3.cpp : Defines the entry point for the applica...原创 2018-12-20 21:01:19 · 624 阅读 · 0 评论 -
程序基本算法习题解析 设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。
题目:羽毛球队有男女运动员各n人。给定2个n*n矩阵P和Q。P[i][j]是男运动员i和女运动员j,配对组成混合双打的男运动员竞赛优势,Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势。由于技术配合和心理状态等各种因素影响,P[i][j]不一定等于Q[j][i]。男运动员i和女运动员j配对组成混合双打的男女双方竞赛优势为P[i][j]*Q[j][i]。设计一个算法,计算男女运动员最...原创 2018-12-24 10:13:34 · 2328 阅读 · 0 评论 -
程序基本算法习题解析 子集和问题
题目:子集和问题。S={x1,x2,...,xn}是一个正整数的集合,c是一个正整数。是否存在S的一个子集S1,使得S1中的各元素之和等于c。思路:首先进行全部元素的求和,如果该和小于给定正整数c,则判定为无解;在有解的基础上,对S从大到小排序,删除掉比给定正整数大的元素,重新组合成一个子集subS,减少程序运行时间。然后根据子集中元素个数进行尝试,暂定子集中有一个元素,遍历一遍;...原创 2018-12-24 22:10:34 · 2315 阅读 · 1 评论 -
程序基本算法习题解析 对于给定的正整数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共有多少种不同的分解式。思路:对每个因子递归搜索。以12为例,画个示意图:然后 1+4+3 = 8,即为分解式个数。程序如下...原创 2018-12-17 16:31:08 · 7141 阅读 · 1 评论 -
程序基本算法习题解析 写出在Fibonacci数组A中查找特定值的二分查找过程。
书上原题目为:数组A含有9个元素,这些元素恰好是第2至第10个Fibonacci数,写出在数组A中查找x=17的二分查找过程。Fibonacci数列的递推公式为:前10个Fibonacci数为:1 1 2 3 5 8 13 21 34 55 因此数组A为:1 2 3 5 8 13 21 34 55从数组中可以看到,x=17并不在数组中。而且我觉得让用户输入需要查询...原创 2018-12-17 15:29:23 · 219 阅读 · 1 评论 -
程序基本算法习题解析 用分治法设计一个算法,找出伪造硬币
题目:一个装有16枚硬币的袋子,16枚硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻。现有一台可用来比较两组硬币重量的仪器,请使用分治法设计一个算法,可以找出那枚伪造的硬币。首先建立一个有16个int数据类型的数组,模拟16枚硬币,真币赋为1,假币赋为0。根据二分搜索法的原理,设计算法代码如下:// Chapter7_3.cpp : Defines the entry po...原创 2018-12-17 14:29:56 · 5010 阅读 · 0 评论 -
程序基本算法习题解析 编写代码实现杨辉三角
先附上书上的代码(书上用c写的,这里转换成了c++,但是思路没变):#include "stdafx.h"#include<iostream>using namespace std;int main(){ int a[11][20],i,j; for(i=0;i<11;i++) for(j=0;j<20;j++) ...原创 2018-12-14 15:13:25 · 408 阅读 · 0 评论 -
程序基本算法习题解析 如果有两个数,每一个数的所有约数(除它本身以外)的和正好等于另一个数,则称这两个数为互满数。求出3000以内所有的互满数并输出。
题目: 如果有两个数,每一个数的所有约数(除它本身以外)的和正好等于另一个数,则称这两个数为互满数。求出3000以内所有的互满数并输出。先附上代码:// Chapter1_8.cpp : Defines the entry point for the application.// 如果有两个数,每一个数的所有约数(除它本身以外)的和正好等于另一个数,则称这两个数为互满...原创 2018-12-14 16:14:08 · 3164 阅读 · 0 评论 -
程序基本算法习题解析 验证任意一个大于5的奇数可以表示为3个素数之和
题目:验证任意一个大于5的奇数可以表示为3个素数之和。附上代码:// Chapter1_9.cpp : Defines the entry point for the application.// 验证任意一个大于5的奇数可以表示为3个素数之和#include "stdafx.h"#include<iostream>#include<math.h>...原创 2018-12-14 17:23:07 · 5504 阅读 · 3 评论 -
程序基本算法习题解析 使用筛选法求出1~100之内的所有素数
思路: 第一个素数是2,把后面是2的整数倍的数全部筛去,筛去的数置0;从第一个素数2向后找出最小的未被筛去的数3,把它后面是3的整数倍的数全部筛去并置0;重复上述过程,直到新找到的素数大于100的平方根位置,至此,所有剩余的未被筛去的数都是素数。附上代码:// Chapter5_2.cpp : Defines the entry point for the ...原创 2018-12-15 15:45:12 · 2401 阅读 · 0 评论 -
程序基本算法习题解析 求pi的近似值
思路:pi/4 = 1 - 1/3 +1/5 -1/7 + ...附上代码:// Chapter5_3.cpp : Defines the entry point for the application.// 求pi的近似值#include "stdafx.h"#include<iostream>#include<math.h>using nam...原创 2018-12-15 15:59:09 · 1746 阅读 · 1 评论 -
程序基本算法习题解析 求出100之内的所有可逆素数
题目:可逆素数是指一个素数将其各位数字的顺序倒过来构成的反序数也是素数,求出100之内的所有可逆素数。附上代码:// Chapter5_4.cpp : Defines the entry point for the application.// 求出100之内的所有可逆素数// 可逆素数是指一个素数将其各位数字的顺序倒过来构成的反序数也是素数#include "stdafx....原创 2018-12-15 16:55:34 · 3961 阅读 · 0 评论 -
程序基本算法习题解析 百钱买百鸡问题
题目:百钱买百鸡问题:公鸡每只5元,母鸡每只3元,小鸡3只一元。现有100元钱要求买100只鸡,问小鸡、公鸡、母鸡各多少只?附上代码:// Chapter5_5.cpp : Defines the entry point for the application.// 百钱买百鸡问题// 公鸡每只5元,母鸡每只3元,小鸡3只一元。// 现有100元钱要求买100只鸡,问小鸡、公鸡...原创 2018-12-15 17:15:17 · 10547 阅读 · 0 评论 -
程序基本算法习题解析 编写一个计算幂级数的递归函数
思路:附上代码:// Chapter6_1.cpp : Defines the entry point for the application.// 编写一个计算幂级数的递归函数#include "stdafx.h"#include<iostream>using namespace std;//求x的n次幂int funPower(int x,int n)...原创 2018-12-15 21:40:26 · 1932 阅读 · 0 评论 -
程序基本算法习题解析 用递归函数求 s=1+2+3+...+n 的和。
附上代码:// Chapter6_2.cpp : Defines the entry point for the application.// 用递归函数求 s=1+2+3+...+n 的和#include "stdafx.h"#include<iostream>using namespace std;int funSum(int n){ if(n == 1)...原创 2018-12-15 21:50:22 · 9383 阅读 · 0 评论 -
程序基本算法习题解析 采用迭代法使用牛顿切线法求解方程
求近似值的公式为:附上代码:// Chapter6_3.cpp : Defines the entry point for the application.// 采用迭代法使用牛顿切线法求解方程#include "stdafx.h"#include<iostream>#include<math.h>using namespace std;//求函...原创 2018-12-15 22:20:15 · 867 阅读 · 0 评论 -
程序基本算法习题解析 用分治法设计一个算法,统计输入的非空字符串中给定字符的个数
首先附上一般思路的代码(不用分治法,将输入字符串中的字符从前往后依次比对):// Chapter7_1.cpp : Defines the entry point for the application.// 用分治法设计一个算法,统计输入的非空字符串中给定字符的个数#include "stdafx.h"#include<iostream>#include<str...原创 2018-12-17 10:55:46 · 863 阅读 · 0 评论 -
程序基本算法习题解析 根据9*9盘面上的已知数字,推出所有剩余空格的数字。
题目:根据9*9盘面上的已知数字,推出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1~9且不重复。思路:(摘抄书上)由于数独问题都是9*9的,所以解空间有81层,每层有9个分支,通过遍历解空间求解。如果只求一个解,可以在得到解之后返回,标记是否得到解可以用全局变量实现。对于同一行、同一列的重复判断,只需要用两个二维数组表示某一个数是否在该行出现。而对小格子...原创 2018-12-25 15:25:56 · 2307 阅读 · 0 评论 -
程序基本算法习题解析 寻找字符串:给定一个字符串S,重新排列该字符串中的全部字母组成新的字符串s,求s中字符串Bulbasaur出现的次数。
思路:由于字符串S可以重新排列,因此,这个题目不是求字符串的匹配问题,而是查找和统计的问题。只需统计Bulbasaur这个单词中每个字符出现的次数,最少出现次数就是答案。需要注意的是,字母a和字母u均出现两次,在最后计算比较的时候需要除以2.代码如下:// Chapter11_1.cpp : Defines the entry point for the application./...原创 2018-12-25 16:11:16 · 3324 阅读 · 0 评论 -
程序基本算法习题解析 给定n个字符{r1,r2,...,rn},要求生成n个字符的全排列。
要求输入一行字符串,输出所有排列。思路:可使用分治法(递归法)求解该题,步骤如下:(设字符数组为A[n])选取数组A中的某个元素作为该数组的第一个数(交换位置),对剩下的元素进行全排列;在剩下的元素中,选取其中某个元素作为子字符数组的第一个数,对剩下的元素进行全排列,...,直到最后只剩一个元素,输出该数组。例如有一个字符串为abcd,则将a、b、c、d分别作为第一个数,对剩下的字...原创 2019-01-07 21:01:52 · 1937 阅读 · 0 评论 -
程序基本算法习题解析 找出从自然数1~n中任取r个元素的所有组合。
要求输入n和r,输出r个元素的所有组合。思路:可使用分治法(递归法)求解该题,步骤如下:选取1~n中某个整数为该组合的第一个数,对剩下r-1个数进行组合;再从剩下的n-1个数中,选取某个整数为该组合的第2个数,对剩下的r-2个数进行组合;...,直到选取了r个数,此时,输出该组合结果。为了不重复选取,可从小到大的选取整数,保证组合中的整数是逐渐增大的。例如,选取3作为组合中的第一个...原创 2019-01-07 22:18:12 · 4935 阅读 · 0 评论 -
程序基本算法习题解析 线性时间选择:给定线性集中有n个元素,要求找出这n个元素中第k小的元素。 给定的线性集是无序的,要求在线性时间内完成。
题目:在给定线性集中有n个元素,要求找出这n个元素中第k(1<=k<=n)小的元素。给定的线性集是无序的。要求在线性时间内完成,线性时间的要求是指在最坏情况下也要保证在O(n)时间内完成选择。输入3行,第一行为数据元素个数,第二行为需要确定的第k小的元素,第三行输入数据元素,用空格隔开。输出一行,输出第k小的元素。思路:若是没有要求在O(N)时间内完成选择,那么最简单的做法...原创 2019-01-11 20:02:20 · 6868 阅读 · 0 评论 -
快速排序算法
最开始学习编程,遇到排序问题,一般都是用冒泡法,因为冒泡法好理解,代码量少。但是这种算法时间复杂度高,当需要排序的元素较多时,程序运行时间很长,因此产生了快速排序算法。该算法的实现可分为以下几步:1. 在数组中选一个基准数(通常为数组第一个);2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;3. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个...原创 2019-01-11 21:09:08 · 227093 阅读 · 88 评论 -
程序基本算法习题解析 动态规划-线段覆盖: 数轴上有n条线段,线段的两端都是整数坐标,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合),且线段价值之和最大。
题目:线段覆盖:数轴上有n条线段,线段的两端都是整数坐标,坐标的范围为0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合),且线段价值之和最大。输入第一行一个整数n(n<=1000),表示有多少条线段接下来的n行,每行3个整数ai,bi,ci,分别代表第i条线段的左端点ai,右端点bi,价值ci。输出能够获得的最大价值。思路:...原创 2019-01-15 18:04:14 · 2560 阅读 · 0 评论 -
程序基本算法习题解析 动态规划-装箱问题:有一个箱子容积为v,同时有n个物品,每个物品有一个体积。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。
题目:有一个箱子容积为v(0~20000),同时有n(0~30)个物品,每个物品有一个体积。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。输入一个整数v,表示箱子容积,一个整数n,表示物品个数。接下来输入n个整数,分别表示这n个物品的体积。输出一个整数,表示箱子剩余空间。思路:可设一个元素个数为 max(v)+1的数组dp[20001],里面任意一个元素dp[i]表示箱子...原创 2019-01-16 15:17:40 · 8753 阅读 · 2 评论 -
程序基本算法习题解析 动态规划-过河卒
题目:A点有一个过河卒,需要走到目标B点。卒可以向下或者向右走。同时在棋盘上任意一点有一个对方的马,该马所在的点和马跳跃一步可达的所有点称为马的控制点。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数,并由键盘输入),马的位置坐标也要给出(约定:C不等于A,同时C不等于B)。要求计算出卒从A点能够到达B点的路径的条数。输入B点的坐标(n,m)(1<=n,m<...原创 2019-01-17 11:18:59 · 1051 阅读 · 0 评论 -
程序基本算法习题解析 动态规划-乘积最大:设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积最大。
题目:设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积最大。例如,数字串为312,当N=3,K=1时会有以下两种分法:3*12=36和31*2=62,符合题目要求的结果为31*2=62。程序的输入共有两行:第一行共有两个自然数N、K(6<=N<=40,1<=K<=6),第二行是一个长度为N的数字串,输出一个整数,...原创 2019-01-17 15:43:56 · 9555 阅读 · 1 评论 -
程序基本算法习题解析 动态规划-数的划分 将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。求整数n分为k份,共有多少种不同的分法。
题目:将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。求整数n分为k份,共有多少种不同的分法。输入两个整数n,k(6<n<=200,2<=k<=6)。输出一个整数,即有几种不同的分法。思路:定义一个数组dp[][],dp[i][j]表示将整数 i 划分为 j 份 的方案数。dp[i][j]的动态转移方程为 :如何理解该式子呢?首...原创 2019-01-18 14:14:55 · 19609 阅读 · 11 评论 -
c++ 求字符串中最大的包含单词个数
题目:给定一个字符串,输出其最大的包含单词个数以及所包含的单词。限制条件如下:1.每份中包含的单词可以部分重叠。2.当选用一个单词后,其第一个字母不能再用。例如字母串this中可包含this和is,选用this之后就不能包含th,因为t开头的单词已经包含在内了。输入一个字符串、字典中单词的个数以及词典内容,输出最大的包含单词个数以及所包含的单词。该题目是CODEVS2010的变体(...原创 2019-01-21 18:55:41 · 838 阅读 · 0 评论 -
程序基本算法习题解析 动态规划-统计单词个数:给出一个长度不超过200,而且全部小写英文字母组成的字符串。 要求将此字符串分成k份,输出最大的包含单词个数。
题目:给出一个长度不超过200,而且全部小写英文字母组成的字符串(该字符串必须每行20个字母的方式输入)。要求将此字符串分成k份(1<k<=40),输出最大的包含单词个数。限制条件如下:1.每份中包含的单词可以部分重叠。2.当选用一个单词后,其第一个字母不能再用。例如字母串this中可包含this和is,选用this之后就不能包含th,因为t开头的单词已经包含在内了。3.单词由...原创 2019-01-21 20:56:38 · 3802 阅读 · 0 评论 -
程序基本算法习题解析 给定整数n,请统计在[a,b]区间内与n互质的数的个数。
题目:给定整数n,请统计在[a,b]区间内与n互质的数的个数。互质是指两个数的最大公因数是1。第一行输入一个整数T(1<=T<=100),表示T组测试数据。接下来的T行,每行输入a,b,n共3个。输出一个整数,表示与n互质的整数的个数。思路:可以对区间内的每个数进行互质判断。例如,给定整数n,区间内的某数为x,则可设k从2开始到min(n,x)结束,判断是否存在k满足同时被...原创 2019-01-04 21:06:05 · 1091 阅读 · 0 评论