Java01背包改进
Posted z2529827226
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java01背包改进相关的知识,希望对你有一定的参考价值。
package dp; class dpArray private int dp[][]; private int w[]; private int v[]; private int memo[]; public int res() for(int i=1;i<=4;++i) for(int j=1;j<=7;++j) if(j<w[i]) dp[i][j]=dp[i-1][j]; /** * 比如在这里对于每种物品背包的容量都从1到最大去比较,为无后效性 */ else dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]); /** * 相互独立又有联系 */ return 0; public dpArray() w=new int[]0,2,5,4,7; v=new int[]0,3,2,4,1; dp=new int[6][9]; memo=new int[6]; /** * 数组在进行定义是就被初始化为0 * dp数组的横向表示背包的容量 * dp数组的纵向表示物品 * 无后效性,以后dp数组中的值只与之前的值有关与之前的值是怎么得到的无关,换句话说就是之前的值的确定过程不会 * 对以后值的确定过程造成影响 */ public boolean printdp() for(int i=1;i<5;++i) for(int j=1;j<8;++j) System.out.print(dp[i][j]+" "); System.out.println(); System.out.println(); for(int i=0;i<5;++i) System.out.print(memo[i]); return true; /** * 两种情况:选择与没有选择 * dp[x][y]==dp[x-1][y]:没有选择,直接跳到它的上面memo数组不变 * dp[x][y]==dp[x-1][y-w[x]]+v[x]:memo数组做出标记1 * x==0:容量为0时结束循环 */ public void findWhat(int i, int j) //最优解情况 if (i > 0) if (dp[i][j] == dp[i - 1][j]) memo[i] = 0; findWhat(i - 1, j); else if (j - w[i] >= 0 && dp[i][j] == dp[i - 1][j - w[i]] + v[i]) //dp[i - 1][j - w[i]] + v[i]表示上一次的价值加上这次加上物品的价值的总价值 memo[i] = 1; findWhat(i - 1, j - w[i]); public class Mainx public static void main(String[] args) dpArray space= new dpArray(); space.res(); space.findWhat(4, 7); space.printdp();
以上是关于Java01背包改进的主要内容,如果未能解决你的问题,请参考以下文章