递归和分治策略将一个大小为n的问题分解为k个更小的子问题,这些子问题相互独立且相同原问题,递归求解这些子问题问题,然后将各个子问题的解组合起来,得到原问题的解。[题目]使用快速排序方法对一维数组进行排序。[思考]对于输入的子数组a[p:r],按照以下三个步骤进行排序:1)分解划分:将a[p:r]划分为3段a[p],a[p]为参考元素:q-1、a[q]和a[q+1:r],其中a[q]不小于a[p:q-1]中的任何元素且不大于a[q+1:r]对于中的任意元素,下标q在除法中确定。2)递归求解conquer:通过递归调用sort对a[p:q-1]和a[q+1:r]进行排序。3)Merge合并:合并a[p:q-1]、a[q]和a[q+1:r],作为最终结果返回。【代码实现】var__array__=[1,3,2,4,5,57,6,46,4,6,45];console.log("排序前:"+__array__);functionsort(x,y){if(xflag&&y>x){y--;}如果(x>=y){中断;}vartemp=__array__[x];__array__[x]=__array__[y];__array__[y]=温度;}if(__array__[x]>flag){x--;}__array__[p]=__array__[x];__array__[x]=标志;returnx;}sort(0,__array__.length-1);console.log("排序后:"+__array__);动态规划和分治法的基本思想有共同点,不同的是子问题往往不是独立的,父问题要通过子问题的解来判断,所以将计算出的问题记录在表中,以后需要查询时,可以避免重复计算。这就是动态规划的基本思想。然而,动态规划可以有多种实现方式,但它们的填表格式都是一样的。通常,算法按照以下步骤设计:1)找出最优解的性质,并描述其结构特征;2)递归定义最优值;3)自底向上计算最优值;4)通过在计算最优值时刻意记录判断结果来构建最优解。使用该算法思想可以设计的问题一般具有两个决定性的性质:1)最优子结构性质;2)子问题的重叠属性。备忘录算法的思路与上述算法类似,不同的是备忘录为每一个解决的子问题创建一个备忘录,以供需要时查看,避免了对同一个问题进行多次计算。一般来说,当一个问题的所有子问题都至少要解决一次时,使用动态规划比备忘录好,因为不会有任务的暂存,也没有多余的计算;当子问题空间中的某些问题不必解决时,使用Memos更好。但以上都不是绝对的。我只是想区分这两种想法之间的区别。在具体情况下,我们还是需要在保证可行性的前提下,根据业务场景选择更好的方式。【题目】给定n个矩形{A1,A2,...,An},其中Ai与Ai+1相乘,由于矩阵满足结合律,不同的括号法计算时间不同,求最优的括号法.【思考】分别计算1,2,3,...,n个矩阵的最优解。在计算i时,已经记录了i-1的所有最优解,保证不重复计算。【代码实现】/***初始化数据*/varP=[30,35,15,5,10,20,25];//记录矩阵的大小varnum=P.length-1;//矩阵编号varminNum=[];vari,j;//全局复杂循环变量/***初始化数据*/for(i=0;ii+j-1是一个组)varsplitIndex=j;varsplitMin=minNum[j][i+j-2]+P[j-1]*P[j]*P[i+j-1];minNum[j-1][i+j-2]=splitMin;for(splitIndex=j+1;splitIndex<=i+j-2;splitIndex++){splitMin=minNum[j-1][splitIndex-1]+minNum[splitIndex][i+j-2]+P[j-1]*P[splitIndex]*P[i+j-1];如果(splitMinn){//如果到达根if(nowW1>nowBest1)nowBest1=nowW1;返回;}if(nowW1+w[deep-1]<=weight1){//如果1个分支可以nowW1+=w[deep-1];加载(深+1);现在W1-=w[深-1];}//0分支Loading(deep+1);}functionmain(){Loading(1);varfirstLoad=nowBest1;变种全部=0;对于(vari=0;iweight2+firstLoad){console.log("failuren");}else{console.log("成功n");}}主要的();很容易想到分支限界比较回溯法,用广度优先的方法不断扩展当前节点的子节点作为当前节点,主要是求一个最优解,算法比回溯法简单.【题目】有一批n个集装箱要装在两艘船上,载荷为c1和c2,其中集装箱i的重量为wi,所有集装箱的重量不大于两艘船的载荷之和船。有负载吗?场景已加载。[思考]借助队列,逐层校验,寻找最优解。【代码实现】varweight1=30;//第一艘船的重量varweight2=10;//第二艘船的重量varw=[1,9,9,4,4,9];//容器变量nowBest1=0;//当前最优加载varn=w.length;//容器个数vararrayFIFO=[];arrayFIFO.push([1,1]);//深度,已经加载arrayFIFO.push([1,0]);varnowBest1=1;while(arrayFIFO.length>0){varnowNode=arrayFIFO.shift();currentDeep=nowNode[0];当前权重=现在节点[1];if(currentDeep>=n){if(currentWeight>nowBest1){nowBest1=currentWeight;}}else{arrayFIFO.push([currentDeep+1,currentWeight]);如果(currentWeight+w[currentDeep]