01背包 一维数组解法
public int bookone(int[] weight,int[] val,int b){ int[] a=new int[b+1]; for (int i=1;i<weight.length;i++){ for (int j=b;j>=weight[i];j--){ a[j]=a[j-weight[i]]+val[i]>a[j]?a[j-weight[i]]+val[i]:a[j-1]; } } return a[b]; }
01背包 二维数组解法
public int booktwo(int[] weight,int[] val,int a){ int[][] dp=new int[weight.length][a+1]; for (int i=1;i<weight.length;i++){ for (int j=a;j>=weight[i];j--){ dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-weight[i]]+val[i]); } } return dp[weight.length-1][a]; }
完全背包 一维数组解法
public static int bookone(int[] weight,int[] val,int a) { int[] b = new int[a + 1]; for (int i = 1; i < weight.length; i++) { for (int j = weight[i]; j <= a; j++) { b[j] =(b[j] < b[j - weight[i]] + val[i])?b[j - weight[i]] + val[i]:b[j]; } } return b[a]; }
完全背包 二维数组解法
public int booktwo(int[] weight,int[] val,int a) { int[][] dp=new int[weight.length][a+1]; for (int i=1;i<weight.length;i++){ for (int j=weight[i];j<=a;j++){ for (int k=0;k<=j/weight[i];k++){ dp[i][j]=j-k*weight[i]>=0?Math.max(dp[i-1][j],dp[i-1][j-weight[i]*k]+val[i]*k):dp[i-1][j]; } } } return dp[weight.length-1][a]; }
多重背包一维数组解法 public static int booktwo(int[] weight,int[] val,int[] count,int a) { int[] dp=new int[a+1]; for (int i=1;i<weight.length;i++){ for (int j=a;j>=weight[i];j--){ for (int k=0;k<=count[i];k++){ dp[j]=(j-k*weight[i]>=0&&dp[j]<dp[j-k*weight[i]]+k*val[i])?dp[j-k*weight[i]]+k*val[i]:dp[j]; } } } return dp[a]; }
多重背包二维数组解法
public int booktwo(int[] weight,int[] val,int[] count,int a) { int[][] dp=new int[weight.length][a+1]; for (int i=1;i<weight.length;i++){ for (int j=weight[i];j<=a;j++){ for (int k=0;k<=count[i];k++){ dp[i][j]=(j-k*weight[i]>=0)&&(dp[i][j]<dp[i-1][j-k*weight[i]]+k*val[i])?dp[i-1][j-k*weight[i]]+k*val[i]:dp[i][j]; } } } return dp[weight.length-1][a]; }