算法
Coding_Cadenza
这个作者很懒,什么都没留下…
展开
-
0-1背包问题
问题描述:给出背包的容积,商品的价格和商品的体积,在不超过背包容量的情况下,买走价格最大的商品。(所谓0-1,就是每件商品最多只能选一次,所以这是个很基础的动态规划问题)商品如下:方法1:回溯算法该算法基于以递归的方式建立的枚举算法。枚举递归的基本思想:要求剩余i件商品,背包剩余容积为c时的最大价格(最优解),只需要求(剩余i-1件商品,背包剩余容积为c时的最优解)和(剩余i-1件商品,背包剩余容积为(c-第i件商品的体积)的最优解加上第i件商品的价格)的最大值。 因为剩余i-1种商品有两种情况原创 2020-07-21 18:07:20 · 196 阅读 · 0 评论 -
次序选择问题
给定一个数组A,求出第k小的元素。这是一个次序选择问题,求解方法多种,此处介绍在快排的思想上进行改造的分治算法。原数组原数组通过一次分解,求出随机选出的新主元的位置,该位置返回到主递归函数赋值给变量q比较k和q的位置,若k在q的右边,则只对右边进行进一次拆分,若为左边则相反。直到q的位置刚好对应的是k所表达的位置,则此时q位置的元素为第k小的元素,因为它左边的都比它小,右边的都比它大。比较这一步要注意。#include<iostream>using namespace std;原创 2020-07-18 22:21:21 · 1594 阅读 · 0 评论 -
分治法求最大子数组
求最大子数组:一给定好的数组,在不改变起排列顺序的情况下,求非空的求和最大的子数组。思路:把原数组分成两半,分别求两半的最大子数组,再求这两半合并后从中间往两边的最大子数组。然后把这三部分比较,得到整个的最大子数组。例子:先分,如图再治:上代码:#include<iostream>using namespace std;#include<limits.h>int max(int a, int b, int c){ return a > (b >原创 2020-06-25 11:06:23 · 1490 阅读 · 1 评论 -
随机主元快速排序
快速排序,也是用的分而治之的算法,但是与归并不一样的,归并排序侧重的是最后怎么把子问题合并,分解子问题就是从中间分开。快排侧重于把子问题分开的部分,而不侧重合并下面看个将数组从小到大排序的例子:(1)两个索引,P1和P2。P1的左边(包括P1)是比主元小的元素,,又边则是比主元大的元素。P2遍历没有考察的元素(2)随机选取主元。在数组中,随机选取一个元素,令其作为标准,结束后其左边是比它小的元素,右边是比他大的元素。选取主元后,将主元放到数组最右边,方便考察。(3)开始考察4比3大,不动原创 2020-07-15 20:21:53 · 750 阅读 · 0 评论 -
归并排序求数组的逆序对数
将求数组的逆序对数问题穿插到归并排序,先求左部分逆序对,再求右部分的逆序对,最后在排序的过程中求跨中间的逆序对数,总的逆序对数是这三部分相加先分:再治(S1:左部分的逆序对数;S2:右部分的逆序对数;S3:跨中间的逆序对数;下一个S1是这三个相加)时间复杂度与归并排序一样都是nlogn;#include<iostream>using namespace std;// 求跨中间逆序对数int merge_count(int a[], int left, int mid, int原创 2020-06-26 22:54:14 · 165 阅读 · 0 评论 -
归并排序
归并排序:用二分的思想把一个排序问题分解成若干个子问题,在每个子问题解决之后再把子问题合并,通过递归 的方式实现。#include<iostream>using namespace std;void merge(int a[], int left, int mid, int right){ int* ans= new int [right - left + 1]; // 开辟一片空间(大小和原数组相等),用指针索引,这个空间就是合并之后下面那个数组,空间大小不一定是原创 2020-06-23 23:07:37 · 101 阅读 · 0 评论