C算法设计学习笔记
文章平均质量分 79
今天不学习,明天变垃圾。
从学习C算法开始,慢慢养成好的算法思想!
Better => Best
搏一搏 单车变摩托
展开
-
最大子段和问题
给定n个整数(可能为负整数)a1,a2,a3……an.求形如 ai,a(i+1),……,aj i,j=1,……n,i<=j的子段和的最大值。当所有的整数均为负整数的时候定义其最大子段和为0,例如:当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为 i=2,j=4(下标从1开始)。一、枚...原创 2020-04-29 08:51:58 · 860 阅读 · 0 评论 -
背包问题
一、无利润背包问题+枚举法解决题目:小明有一只能装10千克的背包,现有白菜一颗5千克,猪肉一块2千克,酱油1.7千克,一条鱼3.5千克,白糖一袋1千克,菜油一桶5.1千克,请编写一个算法,设计小明的背包所装东西的总重量最重。思路分析:题目只是要求包的最终总重量最大,并没有限定选取物品的件数,但备选物品数固定,所以可以直接对这些物品进行枚举。对于任意一种物品,只有“选”与“不选”两种情况,...原创 2020-04-27 11:39:44 · 937 阅读 · 0 评论 -
贪心算法——>解决埃及分数、数列极差问题
一、算法的描述从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解。当达到某算法中的某一步不需要再继续前进时,算法停止。二、算法的设计思想首先贪婪算法的原理是通过局部最优来达到全局最优,采用的是逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的(在一定的标准下),决策一旦作出,就不可再更改。用贪婪算法只能解决通过局部最优的策略能达到全局最优的问...原创 2020-04-26 10:28:36 · 1824 阅读 · 0 评论 -
图的广度优先搜索和深度优先搜索
一、思想概述图的广度优先搜索和深度优先搜索与树的广度优先搜索和深度优先搜索相似,对于树来说,广度优先遍历就是按照树的层结构(逐层搜索)来搜索遍历,而树的深度优先遍历则是按照树高(树的深度)来遍历的。图的广度优先遍历(BFS) : 从图的某一结点出发,首先依次访问该结点的所有邻接顶点Vi1, Vi2, …, Vin,再依次访问与 Vi1, Vi2, …, Vin相邻接的所有未被访问的顶点,重复...原创 2020-04-25 10:37:16 · 637 阅读 · 0 评论 -
回溯算法——>8皇后问题
一、算法的描述回溯算法实际是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试中找问题的解,当不满足求解条件就”回溯”返回,尝试别的路径。回溯算法是尝试搜索算法中最为基本的一种算法,其采用了一种“走不通就掉头”的思想,作为其控制结构。二、算法的设计思想回溯法是在包含问题的所有解的解空间树中。按照深度优先的策略,从根结点出发搜索解空间树,算法搜索至解空间树的任一结点时,总是先判断该结点是否满...原创 2020-04-21 21:34:54 · 359 阅读 · 0 评论 -
动态规划算法——>数塔的求解、资源分配问题
一、算法的说明动态规划主要针对优化问题。所谓规划就是“比较全面的长远的计划”。在动规的算法策略中,它体现在他的决策不是线性的,而是全面考虑各种不同的情况再分别进行决策,最后通过多阶段决策逐步找出问题的最终解。当各个阶段采取决策后,会不断决策出新的数据,直到找到最优解为止。每次的决策又依赖于当前的状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的。所以,这种多阶段的最优化决策解决...原创 2020-04-19 21:21:08 · 1347 阅读 · 0 评论 -
分治算法——>分金块、求残缺棋盘问题
一、分治算法的介绍将整个问题分解成若干个小问题后分而治之。如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。有时问题分解后,不必求解所有的子问题,也就不必作第三步的操作。比如折半查找,在判别出问题的解在某一个子问题中后,其它的子问题就不必求解了,问题的解就是最后(最小)的子问题的...原创 2020-04-18 16:09:56 · 2064 阅读 · 0 评论 -
信息的数字化
一、警察抓小偷问题1.问题描述警察局抓了a,b,c,d四名偷窃嫌疑犯,其中只有一人是小偷。审问中a说:“我不是小偷。”b说:“c是小偷。”c说:“小偷肯定是d。”d说:“c在冤枉人。”现在已经知道四个人中三人说的是真话,一人说的是假话,问到底谁是小偷?2.思路分析将a,b,c,d将四个人进行编号,号码分别为1,2,3,4。则问题可用枚举尝试法来解决。用变量x存放小偷的编号,则x...原创 2020-04-17 10:24:58 · 951 阅读 · 0 评论 -
数组使信息有序化
当题目中的数据缺乏规律时,很难把重复的工作抽象成循环不变式来完成,但先用数组结构存储这些地信息后,问题就迎刃而解。一、编写算法将数字编号翻译成英文编号1.问题描述例:将35706“翻译”成 英文编号three-five-seven-zero-six。2.思路分析(1)思路一1) 编号一般位数较多,可按长整型输入和存储。2) 将英文的“zero——nine”存储在数组中,对应下标为0—...原创 2020-04-15 12:04:32 · 417 阅读 · 0 评论 -
用数组来存储信息
一、统计选票信息1.题目描述某次选举,要从五个候选人(编号分别为1、2、3、4、5)中选一名厂长。请编程完成统计选票的工作。2.算法思路(1)虽然选票发放的数量一般是已知的,但收回的数量通常是无法预知的,所以算法采用随机循环,设计停止标志为“-1”。(2)统计过程的一般方法为:先为五个候选人各自设置五个“计数器”S1,S2,S3,S4,S5,然后根据录入数据通过多分支语句或嵌套条件语句决...原创 2020-04-14 13:40:57 · 2139 阅读 · 0 评论 -
找出n个自然数(1,2,3……n)中取r个数的组合
一、题目描述找出n个自然数(1,2,3……n)中取r个数的组合。例如:当n=5,r=3时,所有组合为;1 2 31 2 41 2 51 3 41 3 51 ...原创 2020-04-13 12:53:42 · 5384 阅读 · 0 评论 -
任何一个正整数都可以用2的幂次方表示:137=2^7+2^3+2^0
一、题目描述例如: 137=27+23+20,同时约定几次方用括号来表示,即ab可表示为a(b),由此可知,137可表示为: 2(7)+2(3)+2(0),进一步: 7=22+2+20 (2^1用2表示) 3=2+2^0.所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0).又如: 1315=2^ 10+28+25+2+1.所以1315最后可表示为:2(2(2...原创 2020-04-12 17:04:47 · 9053 阅读 · 0 评论 -
递归算法及用递归求解整数的分划问题
一、递归的概念递归(recursion)是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。一般为了处理重复性的操作,都采用递归的办法来实现。二、递归算法设计递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题.在逐步求解小问题后,再返回(回溯)得到大问题的解。递归算法只需少量的步骤就可描述出解题过程所需要的多次重复计算,大大地减少了算法的代码量。...原创 2020-04-11 15:49:12 · 1014 阅读 · 0 评论 -
求一个矩阵的鞍点,即在行上最小、列上最大的点
一、算法的设计针对n*n的矩阵进行设计,操作逐行进行,在第一行找到最小值并记录其列号,然后验证它是否为所在列的最大值,如果是的话,则找到了问题的解;如果不是的话,找第二行的最小值,再进行判断…以此类推。1. 顶层算法for(i=0;i<n;i=i+1) {找第i行上最小的元素t及所在列minj; 检验t是否第minj列的最大值,是则输出这个鞍点;}2. 找到第i行...原创 2020-04-10 21:53:55 · 2170 阅读 · 2 评论 -
数组中标志位的使用
数组标志量的运用 在我们编写程序的过程中,会利用很多的表达式来对我们的数据进行不同程度的限定。虽然表达式的书写具有一定的规律性,但这么多的表达式,一定会使得算法的运行效率得不到保证。下面,通过对数组标志量的使用来记录数据是否有重复的现象,避免了许多复杂逻辑表达式的使用。题目: 输入N个整数及一个K值(整数)。打印K值第一次出现是第几个数,如果不出现打印-1。思路分析: (1)涉及到多...原创 2020-04-01 18:13:36 · 807 阅读 · 0 评论 -
求这样的两位数:5位数=2*4位数(9位数字各不相同)
解法一:枚举法(暴力穷举)#include<stdio.h>int main(){ int c, d, e, f, g, h, i, j, k, n2, n3; for (c = 1; c < 10; c++) { for (d = 0; d < 10; d++) ...原创 2020-04-01 20:51:36 · 746 阅读 · 0 评论 -
两种形式的乘式还原
形式一:1. 思路分析:(1)定义一个数组a[4],数组里面存放的值为2,3,5,7;依次对每位数进行穷举,将数组里面的数赋给每位数;利用穷举所求出的值可推算出乘式的第四、第五、最后一行的数字;(2)求出各数后加一个判断条件:判断所求的数是否满足各位为2或3或5或7,因为数太多,所以构造一个子函数用于做判断条件;(3)按题中所给的乘式的形式输出相应的数字。2. 源代码:#incl...原创 2020-04-02 14:47:17 · 825 阅读 · 2 评论 -
回文数及回文字符串的判断
一、回文数1.非递归算法(1)解题思路把目标数n赋给另一个变量s1,然后将s1的高位逐个变为低位(也就相当于把数s1打个颠倒),再判断调整完顺序之后的(s1调到之后为s2)s2值与最初的n的值进行比较,看是否相等,相等的话即为回文数,反之则不是回文数。(2)源程序#include <stdio.h>#include <stdlib.h>void main(...原创 2020-04-03 11:21:49 · 1126 阅读 · 0 评论 -
求1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2n-1)!(-1的n+1次方)
求1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2n-1)!(-1的n+1次方)一、普通的思路——循环的嵌套1. 问题分析此问题中既有累加又有累乘,准确的说累加的对象是累乘的结果。2. 所要构造的数学模型:3. 算法的设计:(伪代码描述)main( ){int i,n,j,sign=1;float s,t=1;input(n);s=1;for(i=2...原创 2020-04-04 13:09:49 · 2106 阅读 · 0 评论 -
用分治算法求一组数的和
1.解题思路(1)将这组数等分为两组(两组数的个数可能差1),分别求这两组数的和;(2)递归分解直到每组数的元素个数<=2,可简单解决两个数以内的和问题;(3)递归出口:如果只有一个数,则直接返回这个数。2.伪代码描述getsum(a,i,j){ if i==j then { return a[i];} else if i==j-1 then { retu...原创 2020-04-05 09:01:05 · 3715 阅读 · 0 评论 -
根据参数n打印具有下面规律的图形
编写算法:根据参数n打印具有下面规律的图形,当n=4时,图形如下:问题分析思路一:容易发现图形中数据排列的规律从1—最大数,通过循环,直接输出 printf是按照从左至右、从上至下的顺序;若想直接输出,只有找出公式,循环计算得到序列:1-\n-5-2-\n-8-6-3-\n-10-9-7-4. (\n表换行)思路二:先用一个数组按此顺序存储数据,再正常输出;...原创 2020-04-06 11:40:28 · 1702 阅读 · 0 评论 -
进制转换:十进制数转十六进制数
进制转换:十进制数转十六进制数问题描述十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。 给出一个非负整数,将它表示成十六进制的形...原创 2020-04-07 09:21:46 · 476 阅读 · 0 评论 -
进制转换——>十进制数转二进制数
1.十进制数转二进制数代码描述:#include <stdio.h>int main(){ int i, j = 0, n; int a[20]; scanf("%d", &n); if (n == 0) printf("0\n"); while (n) { a[j] = n % 2; ...原创 2020-04-08 14:03:04 · 380 阅读 · 0 评论 -
用分治算法求一组数中的最大值、最小值问题
一、求一个最大值、最小值1.解题思路(1)将数据等分为两组(两组数据可能差1),目的是分别选取其中的最大(小)值。(2)递归分解直到每组元素的个数≤2,可简单地找到最大(小)值。 (3)回溯时,在分解的两组解中大者取大,小者取小,合并为当前问题的解。2.算法的伪代码描述float a[n];maxmin (int i, int j ,float &fmax, float ...原创 2020-04-09 11:00:37 · 4791 阅读 · 0 评论