- 博客(24)
- 收藏
- 关注
原创 【程序设计竞赛算法】动态规划——背包问题
动态规划是解决背包问题的经典方法之一。它通过构建一个二维数组(或者称为状态表)来记录子问题的解,然后根据子问题的解逐步推导出整体问题的解。背包问题可以分为 0-1 背包问题和分数背包问题。下面分别介绍这两种问题的动态规划解决方法。
2023-09-01 21:51:00
218
原创 【程序设计竞赛算法】背包问题——贪心法
接着,从单位价值最高的物品开始,依次尝试将物品放入背包中,如果放入会超过背包容量,则跳过该物品;否则,将物品放入背包,并更新背包容量和总价值。如果物品可以完整放入背包,则将物品的重量加入当前背包重量,并将物品的价值加入总价值。2、对于分数背包问题,贪心算法的思路是优先选择单位价值最高的物品放入背包中,直到背包容量为 0 或所有物品都被考虑完毕。与 0-1 背包问题不同的是,分数背包问题允许物品被选择多次,因此可以按照单位价值从高到低进行排序后,依次选择整个物品或者部分物品放入背包,直到背包容量为 0。
2023-09-01 21:46:31
3450
原创 【程序设计竞赛算法】贪心法——硬币问题
在硬币问题中,贪心算法可以得到最优解的前提是硬币面额之间存在倍数关系,即较大面额的硬币是较小面额硬币的倍数。在上述代码中,我们定义了一个 coinChange 函数,接受硬币面额数组 coins[]、硬币数量 n 和目标金额 amount 作为参数,返回最少需要的硬币数量。**·**如果当前硬币面额 ci 小于等于目标金额 amount,那么将该硬币加入找零集合,并将目标金额减去该硬币面额。**·**如果当前硬币面额 ci 大于目标金额 amount,则放弃该硬币,尝试下一个面额较小的硬币。
2023-08-30 22:01:54
2177
原创 【程序设计竞赛算法】贪心法
需要注意的是,贪心算法并不适用于所有问题,只能解决满足贪心选择性质的问题。因此,在应用贪心算法时,需要进行严格的分析和验证,确保所选的贪心策略能够确保获得全局最优解。但需要注意的是,贪心算法并不适用于所有找零问题,例如,如果硬币面额只有1元和3元,贪心算法就无法得到最优解。贪心算法(Greedy Algorithm)是一种常用的优化算法,它在每一步选择中都采取当前状态下最优的选择,以期望能够得到全局最优解。选择的策略应该满足贪心选择性质,即通过选择当前最优解,可以得到最优解的子问题。
2023-08-30 21:55:54
254
原创 【程序设计竞赛算法】广度优先搜索
然后,我们从队列中取出一个节点作为当前节点,访问该节点并输出。接着,我们遍历当前节点的邻居节点,如果邻居节点未被访问,则将其标记为已访问并入队。通过不断出队和入队的操作,广度优先搜索按照层次逐层遍历图中的节点,直到队列为空。它从根节点(或起始节点)开始,按照广度优先的顺序逐层地访问节点,即先访问根节点,然后访问根节点的所有邻居节点,再访问邻居节点的邻居节点,以此类推,直到遍历完所有节点或达到目标节点。注意,该实现并没有考虑图中可能存在环的情况,如果图中存在环,可能导致重复访问节点,需要额外的机制来处理环。
2023-08-30 21:53:13
296
原创 【程序设计竞赛算法】深度优先搜索
然后,我们遍历该节点的邻居节点,如果邻居节点未被访问,则递归调用dfs函数继续探索该邻居节点及其邻居节点。通过递归调用,深度优先搜索会一直沿着一条路径尽可能深入,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,继续选择其他路径进行搜索。它从根节点(或起始节点)开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,再选择其他路径继续探索,直到所有节点都被访问为止。5、如果当前节点没有未被访问的邻居节点,或者已达到目标节点,则回溯到上一个节点。
2023-08-30 21:50:37
148
原创 【程序设计竞赛算法】队列
队列(Queue)是一种重要的数据结构,它在计算机科学中被广泛使用。队列的特点是先进先出(FIFO),也就是说数据从队列的一端添加,从另一端移除。在 C 语言中,实现队列通常需要用到结构体(struct)。(1)Node:一个结构体,表示队列中的一个节点。它通常包含一个数据域和一个指向下一个节点的指针。(2)Queue:一个结构体,表示整个队列。peek/front:查看队列头部的元素(但不移出)enqueue(入队):在队列尾部添加一个元素。dequeue(出队):从队列头部移出一个元素。
2023-07-22 10:27:21
265
原创 【程序设计竞赛算法】栈
在这个例子中,栈顶是最后调用的函数func3,栈底是最先调用的函数func1。当函数func3执行完毕后,它的返回地址和参数会被弹出栈顶,控制权将返回到函数func2中继续执行。类似地,当函数func2执行完毕后,它的返回地址和参数也会被弹出栈顶,控制权将返回到函数func1中继续执行。在函数调用的过程中,每次调用函数都会将调用的函数返回地址、函数参数、局部变量等信息压入栈中。这种方式使得函数调用可以嵌套,即在一个函数中调用另一个函数,而被调用的函数也可以再次调用其他函数,形成一个函数调用栈。
2023-07-22 10:15:09
444
原创 【程序设计竞赛算法】递归函数
否则,函数继续递归调用自身,将原问题转化为(n-1)和(n-2)的斐波那契数列,并将结果相加,最终返回斐波那契数列的结果。例如在计算阶乘的过程中,每次将原问题n转化为规模更小的同类问题(n-1),直到n等于0,问题得以终止。否则,函数继续递归调用自身,将原问题转化为计算前(n-1)个元素的和,并将结果加上a[n-1],最终返回整个数组的和。在递归调用中,每次递归都会将问题规模缩小,所以需要有终止条件来避免无限递归,导致栈溢出等问题。例如在计算阶乘的过程中,当n等于0时,递归结束,返回1作为结果。
2023-07-21 10:45:34
483
原创 【数据结构】递归
链表是一种常用的数据结构,它可以使用递归定义。一个链表可以看作一个节点加上一个链表的组合。具体地,一个链表节点包括数据和指向下一个节点的指针,一个空链表可以表示为一个空指针。int val;使用递归定义链表可以方便地进行链表操作,如遍历、插入、删除等。return;这里的traverseList函数使用递归遍历链表,从头节点开始,每次输出当前节点的值,然后递归调用traverseList函数遍历下一个节点。树是一种重要的数据结构,它可以使用递归定义。一个树可以看作是一个根节点加上若干个子树的组合。
2023-07-21 10:41:24
751
原创 【数据结构】链表
在C语言中,单链表、循环单链表和双向链表都是常用的数据结构,它们各有优缺点,适用于不同的场景。在实现链表时,需要注意节点的定义、头节点和尾节点的处理、遍历、插入、删除和查找等操作。对于单链表,节点定义为包含数据和指向下一个节点的指针的结构体。头节点是指向第一个节点的指针,尾节点为空指针。在插入和删除节点时,需要注意处理头节点和尾节点的变化。对于循环单链表,节点定义和单链表相同,但尾节点指向第一个节点。在插入和删除节点时,需要注意尾节点的变化。
2023-07-21 10:36:26
789
原创 【数据结构】数据结构学习指南
在学习数据结构之前,需要具备一些基本的编程知识和数学知识。具体包括:1、编程语言:需要掌握至少一种编程语言,例如C、Java、Python等,以便能够实现各种数据结构和算法。2、基本数据类型:需要掌握基本数据类型,例如整型、浮点型、字符型等,以及它们的存储方式和运算规则。3、控制结构:需要掌握条件语句、循环语句等基本的控制结构,以便能够编写复杂的程序。4、数学知识:需要掌握基本的数学知识,例如集合、函数、逻辑等,以便能够理解数据结构的定义和算法的设计。
2023-07-21 10:25:32
1159
原创 【数据结构】顺序表与单链表
顺序表是一种基于数组实现的线性表结构,它的元素在内存中是连续存储的。顺序表的基本操作包括创建、插入、删除、查找和遍历等。
2023-07-21 10:18:30
723
原创 【C语言】内存动态分配
在C语言中,动态分配内存是一种常见的操作。动态分配内存可以使程序更加灵活,可以根据需要动态分配和释放内存,而不需要预先知道需要分配多少内存。C语言中动态分配内存主要通过malloc、calloc和realloc函数来实现。
2023-07-21 08:48:58
854
原创 【C语言】文件的读取和写入
在C语言中,可以使用标准库函数来进行文件的读取和写入。这些函数通常被称为文件I/O函数,其中包括打开文件、读取文件、写入文件和关闭文件等操作。
2023-07-21 08:41:55
1359
原创 【C语言】指针
在使用指针之前,必须确保指针指向的内存空间是合法的,并且指针指向的数据类型与访问方式相符。同时,指针的值可能为NULL,表示指针没有指向任何内存空间,因此在使用指针之前必须检查指针是否为NULL。这个代码片段创建了一个整数变量x,然后创建了一个指向x的指针p。指针声明中的星号(*)表示p是一个指向整数类型的指针。指针是一个存储内存地址的变量。需要注意的是,malloc函数返回一个void指针,可以将其强制转换为需要的类型。数组名是指向数组第一个元素的指针,因此可以将数组名赋给指针变量。
2023-07-21 08:36:25
423
原创 【C语言】结构体
以上代码定义了一个包含四个成员的结构体student,定义了一个打印学生信息的函数print_student和一个返回学生结构体变量的函数get_student,同时在main函数中,定义了三个学生结构体变量stu1、stu2和stu3,分别进行了赋值、初始化和调用函数等操作,最后输出了三个学生的信息。在上面的代码中,定义了一个名为student的结构体,包含了四个成员:id、name、age和score,分别表示学生的学号、姓名、年龄和分数,数据类型分别为int、char数组、int和float。
2023-07-21 07:34:12
581
原创 【C语言】for与while循环的区别
总的来说,for循环和while循环都是常用的循环结构,它们可以实现相同的功能,但在语法和使用上有一些区别和联系,需要根据具体的需求和场景来选择合适的循环结构。以上两个示例代码都可以计算1到10的和,但使用了不同的循环结构,其中for循环需要明确指定循环的起始、终止和增量,而while循环则需要手动更新循环变量。C语言中的for循环和while循环都是常用的循环结构,它们的作用是重复执行一段代码,但在语法和使用上有一些区别和联系。1、语法结构不同:for循环具有固定的三个部分:初始化、循环条件和循环增量;
2023-07-20 21:36:44
8426
4
原创 【C语言】break与continue的区别
break语句用于强制退出当前循环或switch语句,即当满足某个条件时,程序会立即跳出循环或switch语句,不再执行循环体内或switch语句后面的代码。在上面的代码中,for循环遍历了数组num,当遇到偶数时,使用continue语句跳过偶数的计算,继续执行下一次循环。在C语言中,break和continue都是控制流语句,它们的作用是改变程序的执行流程,但它们的方式和作用是不同的。在上面的代码中,for循环遍历了数组num,当找到目标数据时,使用break语句跳出循环,输出目标数据的位置。
2023-07-20 21:33:15
2332
原创 C语言学习指导
C语言是一门广泛应用于系统编程、嵌入式系统和科学计算等领域的高级编程语言,学习C语言可以提高编程能力和解决问题的能力。C语言的学习路线包括基础知识、进阶知识和实践项目三个部分,初学者需要掌握C语言的基本语法、数据结构和算法、指针和内存管理、标准库和系统编程、多线程编程和并发控制等知识,以及通过实践项目来巩固所学知识。只有不断的实践和积累,才能够真正掌握C语言编程技能。
2023-07-20 21:29:14
127
原创 可视化大屏
百度网盘获取链接:https://pan.baidu.com/s/1fRfOEYdMfje28y3Tg4b5gA?pwd=DKBB提取码:DKBB。
2023-06-28 22:06:16
1552
C语言图书管理系统(单链表实现)
2023-07-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人