程序设计竞赛(C语言)算法学习
文章平均质量分 53
程序设计竞赛(C语言)算法学习
淡看宝贝
互相学习,共同进步。
展开
-
【程序设计竞赛算法】动态规划——背包问题
动态规划是解决背包问题的经典方法之一。它通过构建一个二维数组(或者称为状态表)来记录子问题的解,然后根据子问题的解逐步推导出整体问题的解。背包问题可以分为 0-1 背包问题和分数背包问题。下面分别介绍这两种问题的动态规划解决方法。原创 2023-09-01 21:51:00 · 161 阅读 · 0 评论 -
【程序设计竞赛算法】背包问题——贪心法
接着,从单位价值最高的物品开始,依次尝试将物品放入背包中,如果放入会超过背包容量,则跳过该物品;否则,将物品放入背包,并更新背包容量和总价值。如果物品可以完整放入背包,则将物品的重量加入当前背包重量,并将物品的价值加入总价值。2、对于分数背包问题,贪心算法的思路是优先选择单位价值最高的物品放入背包中,直到背包容量为 0 或所有物品都被考虑完毕。与 0-1 背包问题不同的是,分数背包问题允许物品被选择多次,因此可以按照单位价值从高到低进行排序后,依次选择整个物品或者部分物品放入背包,直到背包容量为 0。原创 2023-09-01 21:46:31 · 2657 阅读 · 0 评论 -
【程序设计竞赛算法】贪心法——硬币问题
在硬币问题中,贪心算法可以得到最优解的前提是硬币面额之间存在倍数关系,即较大面额的硬币是较小面额硬币的倍数。在上述代码中,我们定义了一个 coinChange 函数,接受硬币面额数组 coins[]、硬币数量 n 和目标金额 amount 作为参数,返回最少需要的硬币数量。**·**如果当前硬币面额 ci 小于等于目标金额 amount,那么将该硬币加入找零集合,并将目标金额减去该硬币面额。**·**如果当前硬币面额 ci 大于目标金额 amount,则放弃该硬币,尝试下一个面额较小的硬币。原创 2023-08-30 22:01:54 · 1854 阅读 · 0 评论 -
【程序设计竞赛算法】贪心法
需要注意的是,贪心算法并不适用于所有问题,只能解决满足贪心选择性质的问题。因此,在应用贪心算法时,需要进行严格的分析和验证,确保所选的贪心策略能够确保获得全局最优解。但需要注意的是,贪心算法并不适用于所有找零问题,例如,如果硬币面额只有1元和3元,贪心算法就无法得到最优解。贪心算法(Greedy Algorithm)是一种常用的优化算法,它在每一步选择中都采取当前状态下最优的选择,以期望能够得到全局最优解。选择的策略应该满足贪心选择性质,即通过选择当前最优解,可以得到最优解的子问题。原创 2023-08-30 21:55:54 · 195 阅读 · 0 评论 -
【程序设计竞赛算法】广度优先搜索
然后,我们从队列中取出一个节点作为当前节点,访问该节点并输出。接着,我们遍历当前节点的邻居节点,如果邻居节点未被访问,则将其标记为已访问并入队。通过不断出队和入队的操作,广度优先搜索按照层次逐层遍历图中的节点,直到队列为空。它从根节点(或起始节点)开始,按照广度优先的顺序逐层地访问节点,即先访问根节点,然后访问根节点的所有邻居节点,再访问邻居节点的邻居节点,以此类推,直到遍历完所有节点或达到目标节点。注意,该实现并没有考虑图中可能存在环的情况,如果图中存在环,可能导致重复访问节点,需要额外的机制来处理环。原创 2023-08-30 21:53:13 · 253 阅读 · 0 评论 -
【程序设计竞赛算法】深度优先搜索
然后,我们遍历该节点的邻居节点,如果邻居节点未被访问,则递归调用dfs函数继续探索该邻居节点及其邻居节点。通过递归调用,深度优先搜索会一直沿着一条路径尽可能深入,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,继续选择其他路径进行搜索。它从根节点(或起始节点)开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,再选择其他路径继续探索,直到所有节点都被访问为止。5、如果当前节点没有未被访问的邻居节点,或者已达到目标节点,则回溯到上一个节点。原创 2023-08-30 21:50:37 · 86 阅读 · 0 评论 -
【程序设计竞赛算法】队列
队列(Queue)是一种重要的数据结构,它在计算机科学中被广泛使用。队列的特点是先进先出(FIFO),也就是说数据从队列的一端添加,从另一端移除。在 C 语言中,实现队列通常需要用到结构体(struct)。(1)Node:一个结构体,表示队列中的一个节点。它通常包含一个数据域和一个指向下一个节点的指针。(2)Queue:一个结构体,表示整个队列。peek/front:查看队列头部的元素(但不移出)enqueue(入队):在队列尾部添加一个元素。dequeue(出队):从队列头部移出一个元素。原创 2023-07-22 10:27:21 · 217 阅读 · 0 评论 -
【程序设计竞赛算法】栈
在这个例子中,栈顶是最后调用的函数func3,栈底是最先调用的函数func1。当函数func3执行完毕后,它的返回地址和参数会被弹出栈顶,控制权将返回到函数func2中继续执行。类似地,当函数func2执行完毕后,它的返回地址和参数也会被弹出栈顶,控制权将返回到函数func1中继续执行。在函数调用的过程中,每次调用函数都会将调用的函数返回地址、函数参数、局部变量等信息压入栈中。这种方式使得函数调用可以嵌套,即在一个函数中调用另一个函数,而被调用的函数也可以再次调用其他函数,形成一个函数调用栈。原创 2023-07-22 10:15:09 · 396 阅读 · 0 评论 -
【程序设计竞赛算法】递归函数
否则,函数继续递归调用自身,将原问题转化为(n-1)和(n-2)的斐波那契数列,并将结果相加,最终返回斐波那契数列的结果。例如在计算阶乘的过程中,每次将原问题n转化为规模更小的同类问题(n-1),直到n等于0,问题得以终止。否则,函数继续递归调用自身,将原问题转化为计算前(n-1)个元素的和,并将结果加上a[n-1],最终返回整个数组的和。在递归调用中,每次递归都会将问题规模缩小,所以需要有终止条件来避免无限递归,导致栈溢出等问题。例如在计算阶乘的过程中,当n等于0时,递归结束,返回1作为结果。原创 2023-07-21 10:45:34 · 431 阅读 · 0 评论