算法方面
。
墨客!
这个作者很懒,什么都没留下…
展开
-
子集和问题
问题描述:给定集合S,S中有n个正整数,M是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中各元素之和等于M。请设计回溯法求解子集和问题,如果问题无解,输出“No Solution”,问题有解,则输出满足子集S1中各元素的值。输入6 123 4 5 7 10 1输出3 4 5#include <iostream>using namespace std;const int N = 10005;int a[N], n, m, rec[N]; bool nu;vo原创 2020-12-20 16:31:36 · 385 阅读 · 0 评论 -
寻宝
小明有一张藏宝图,上面有m*n个房间,每个房间里面都有一个有一定价值的宝物,小明只能从左上角的房间进入收集宝物,且每次只能向右边或向下边的房间继续寻宝,最终只能从最右下的房间出来。请你帮小明计算下他最多可以收集到多少价值的宝物?输入格式:输入第一行给出两个正整数m,n(1=<m,n<=2000),随后给出m行数据,每行都包括n个正整数,中间用空格分割。输出格式:输出收集到的最大价值v,题目保证v<10^9。输入样例:4 41 18 9 37 10 6 125 13 4 1原创 2020-12-20 11:05:36 · 255 阅读 · 1 评论 -
矩阵链相乘问题
矩阵的乘法定义如下:设A是m×p的矩阵,B是p×n的矩阵,则A与B的乘积为m×n的矩阵,记作C=AB,其中,矩阵C中的第i行第j列元素cij可以表示为:当多个矩阵相乘时,采用不同的计算顺序所需的乘法次数不相同。例如,A是50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵, 计算ABC有两种方式:(AB)C和A(BC),前一种需要15000次乘法计算,后一种则只需3500次。设A1,A2,…,An为矩阵序列,Ai是阶为Pi−1∗Pi的矩阵(1≤i≤n)。试确定矩阵的乘法顺序,使得计算A1A2原创 2020-12-20 10:37:42 · 551 阅读 · 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)件物品的重量和价值。输出格式:输出装入背包中物品的最大总价值。输入样例:原创 2020-12-17 14:18:14 · 142 阅读 · 0 评论 -
工作分配问题
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。输入格式:输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。输出格式:将计算出的最小总费用输出到屏幕。输入样例:在这里给出一组输入。例如:310 2 32 3 43 4 5输出样例:在这里给出相应的输出。例如:9#include<iostream>#include&l原创 2020-12-15 20:50:48 · 326 阅读 · 0 评论 -
滑动窗口算法
滑动窗口算法滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。通过不断滑动窗口的大小,判断窗口中元素是否相同,从而解决问题。滑动窗口法的思路我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, rig.转载 2020-12-12 19:30:38 · 333 阅读 · 0 评论 -
priority_queue 说明
priority_queue 说明头文件 #include优先队列。默认是按照从大到小排序的。如果要定义从小达大排列的:priority_queue<int,vector,greater> q;priority_queue 操作q.size();//返回q里元素个数q.empty();//返回q是否为空,空则返回1,否则返回0q.push(k);//在q的末尾插入kq.pop();//删掉q的第一个元素q.top();//返回q的第一个元素例如#include<q转载 2020-12-06 14:05:42 · 169 阅读 · 0 评论 -
假设有N项物品,大小分别为s1、s2、…、si、…、sN,其中si 为满足1≤si ≤100的整数。
假设有N项物品,大小分别为s1、s2、…、si、…、sN,其中si 为满足1≤si ≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数si (1≤si ≤100,表示第i项物品的大小)。输出格式:原创 2020-12-06 13:55:56 · 8014 阅读 · 2 评论 -
int类型变量的取值范围
int类型变量的取值范围?前言前言在学C语言的时候应该都会先了解各种基本数据类型的初值和它们的取值范围,有些人可能会不太重视这块内容,其实很重要,很多大公司面试的过程中都会问到int的取值范围,溢出之后会怎么样等问题。在写程序的时候有时候我们将一个很大的int型的数相加一个数,就会发现结果不对。这是为什么呢?因为这个数超过了int型的取值范围。C语言中int的取值范围为:-2147483648 ~2147483647(也就是-2^31到2^31 -1)解释如下:int类型在C语言中占原创 2020-11-06 15:04:22 · 16567 阅读 · 0 评论 -
银行家算法
1.1 银行家算法的实现思想允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可以顺利地完成),便将资源分配给进程,否则不分配资源,让进程等待。1.2 死锁的概念死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。银转载 2020-11-05 21:35:23 · 279 阅读 · 0 评论 -
算法复杂度分析
算法复杂度分析1. 何为数据结构?何为算法?2. 复杂度分析?算法分析的种类:1. 何为数据结构?何为算法?简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上;栈是先进后出,队列是先进先出。而算法则是对这些数据的操作方法,比如数据的插入、查找、删除、排序等。二者相辅相成,互为一体,数据结构为算法服务,而算法要在指定数据结构上进行操作。2. 复杂度分析?学习数据结构和算法的目的是为了在实际应用的时候更加优化地利用内存,提转载 2020-11-05 21:32:35 · 107 阅读 · 0 评论 -
二分查找算法详解!!!!
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、二分查找的效率二、使用步骤1.引入库2.简单的二分查找总结前言最近刷了很多二分查找相关的题目,这里将近期的收获做一个总结,包括二分查找的变形问题。如果能掌握,我相信以后基本上二分查找相关的问题对你来说,都不是问题。提示:以下是本篇文章正文内容,下面案例可供参考一、二分查找的效率二分查找是啥我想不用过多的说明。我们都知道二分查找的时间复杂程度是O(logN)。O(logn) 查找速度有多快呢?我们来分析一下。转载 2020-11-03 22:55:08 · 3394 阅读 · 3 评论 -
回溯法
什么是回溯法?回溯法(英语:backtracking)是暴力搜寻法中的一种。回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。对于一个问题又是后尝试所有的可能才是最好的办法。这会导致解决过程很慢,我们还是有一些标准化的工具的。例如:对于基本问题,二进制序列(n位的二进制序列有2n种可能),排列(n!),组合(n!/r!(n-r)!转载 2020-10-22 22:21:26 · 327 阅读 · 0 评论 -
什么是分而治之?
什么是分而治之?谓“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解。注意分而治之不是算法,而是一种解决问题的思路工作原理1.找出简单的基线条件;2.确定如何缩小问题的规模,使其符合基线条件。分治算法,即分而治之,就是把原问题分解为几个类似原问题的子问题,解决完子问题,再把子问题的解合并在一起,就可以得到原问题的解。分治算法一般包括三个过程:分解:将原问题分解成若干个子问题。解决:递归求...转载 2020-10-20 11:16:41 · 565 阅读 · 1 评论 -
什么是形式化方法?
了解形式化方法?1.形式化方法可以分为形式化描述和建立在形式化描述基础之上的形式化开发。形式化的描述就是用形式化的语言(具有严格的语法语义定义的语言)做描述。形式化的软件开发,就是用形式化的语言来描述软件需求和特征,并且通过推理验证来保证最终的软件产品是否满足这些需求和具备这些特征。这样的验证当然得建立在严格的语法语义的基础之上的。在实际应用中,这是不容易做到的。形式化方法研究的目的就是希望能够提供更好的理论、方法和工具,扩大形式化方法的应用范围和使用价值。2.形式化方法的意义在于它能帮助发现其它方法不转载 2020-10-19 22:34:03 · 2249 阅读 · 0 评论 -
贪心算法
贪心算法一、 什么是贪心算法? 贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。 贪婪算法是一种分阶段的工作,在每一个阶段,可以认为所做决定是最好的,而不考虑将来的后果。这种“眼下能够拿到的就拿”的策略是这类算法名称的来源。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必转载 2020-10-18 21:17:01 · 391 阅读 · 0 评论 -
动态规划算法
什么是动态规划算法?动态规划算法其实质就是分治思想和解决冗余。因此它与分治法和贪心法类似,都是将待求解问题分解为更小的,相同的子问题,然后对子问题进行求解,最终产生一个整体最优解。适合采用动态规划法求解的问题,经分解得到的各个子问题往往不是相互独立的。在求解过程中,将已解决的子问题的解进行保存,在需要时可以轻松地找出。示例如下:Fibonacci数列 0 n=0 f(n)= 1 n=1 f(n-1)+f(n-2) n>1转载 2020-10-17 20:27:36 · 476 阅读 · 0 评论 -
进程和线程的区别
进程和线程的区别1、首先是定义进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。2、一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。3、线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。4、转载 2020-10-16 22:21:56 · 5261 阅读 · 0 评论