当前位置: 首页 > 科技观察

Java编程技巧-数据结构与算法《动态编程算法》

时间:2023-03-20 12:56:20 科技观察

应用场景-背包问题背包问题:有一个背包,容量为4磅,有以下物品:要求的目标是总价值为背包装载的最大且重量不超过要求的物品不得重复。动态规划算法介绍动态规划(DynamicProgramming)算法的核心思想:把一个大问题分成小问题求解,然后一步步求得最优解。动态规划算法类似于分而治之算法。它的基本思想是将待解决的问题分解成若干个子问题,先求解子问题,再从这些子问题的解中得到原问题的解。与分治算法不同,适合动态规划的子问题往往不是相互独立的。(即下一个子阶段的解是在上一个子阶段的解的基础上进一步求解)。动态规划可以通过填表的方式逐步推进,得到最优解。背包问题分析背包问题主要是指一个给定容量的背包和若干个具有一定价值和重量的物品。如何挑选物品并放入背包,才是最有价值的物品。其中有01背包和完整背包(完整背包是指:每件物品无限件可用)。这里的问题属于01背包,即每个物品最多只能放一个,无限背包可以转换成01背包。思路分析算法的主要思想是用动态规划求解。对于每次遍历的第i个物品,根据w[i]和v[i]判断该物品是否需要放入背包。即,对于给定的n件物品,令v[i]和w[i]分别为第i件物品的价值和重量,C为背包的容量。令v[i][j]表示容量为j的背包中前i项的最大值。则有如下结果:v[i][0]=v[0][j]=0;//表示w[i]>j时表格第一行第一列为0:v[i][j]=v[i-1][j];//当新添加的待添加商品的容量大于当前背包的容量时,直接使用上一个cell的加载策略.当j>=w[i]时:v[i][j]=max{v[i-1][j],v[i]+v[i-1][j-w[i]]};//当要添加的新产品的容量小于等于当前背包的容量时,加载方式:v[i-1][j]:是前一个cellv[i]中加载的最大值:currentThevalueoftheproductv[i-1][j-w[i]]:加载i-1个产品,填表到剩余空间的最大值[j-w[i]代码案例packagecom.xie。算法;导入java.util。数组;publicclassKnapsackProblem{publicstaticvoidmain(String[]args){//物品的重量int[]w={1,4,3};//物品的价值int[]val={1500,3000,2000};//背包的容量intm=4;//物品个数intn=val.length;//为了记录物品放入情况,定义一个二维数组int[][]path=newint[n+1][m+1];//创建一个二维数组//v[i][j]代表容量为j的背包在前i项中能装的最大值int[][]v=newint[n+1][m+1];//初始化第一行第一列//设置第一列为0for(inti=0;ij){v[i][j]=v[i-1][j];}else{//因为我们的程序i从1开始//v[i][j]=Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);if(v[i-1][j]>val[i-1]+v[i-1][j-w[i-1]]]){v[i][j]=v[i-1][j];}else{v[i][j]=val[i-1]+v[i-1][j-w[i-1]];//记录当前情况到pathpath[i][j]=1;}}}}for(inti=0;i0&&j>0){if(path[i][j]==1){System.out.printf("将%d物品放入背包\n",i);j-=w[i-1];}i--;}}/***[0,0,0,0,0]*[0,1500,1500,1500,1500]*[0,1500,1500,1500,3000]*[0,1500,1500,2000,3500]*第三项放第一项产品入背包*/}【编者推荐】虚拟服务器管理的6个优秀实践2021年引领软件开发行业发展的15个技术趋势5款电脑装机必备软件,一个比一个强大,用过之后,没有它我活不下去。太好了。看过SpringCloud微服务架构的详细说明|附面试题。中国三大电信运营商纽交所退市亏损了吗?