标题:01背包问题使用递归和非递归
见视频:添加链接描述
F(k,w),k:前几件物品可以偷,w,当前背包容量
package com.suanfa;
import javafx.beans.WeakInvalidationListener;
import java.util.Arrays;
/**
01背包问题
01背包问题:https://www.bilibili.com/video/BV1g7411B7SP?spm_id_from=333.999.0.0
**/
public class TestDp5 {
int[] weight;//重量
int[] value;//价值
public static void main(String[] args) {
TestDp5 testDp = new TestDp5();
System.out.println(testDp.test(new int[]{2,3,4,5},new int[]{3,4,5,8},4 ,8));
System.out.println(testDp.fun2(new int[]{2,3,4,5},new int[]{3,4,5,8},4 ,8));
}
//方法一,使用递归,fun
public int test(int[] weight,int[] value,int n,int m){
this.weight = weight;
this.value = value;
return fun(n - 1,m);
}
public int fun(int n,int m){
if(n == 0 || m == 0){
return 0;
}
int m1 = 0;
//可以装入
if(m - weight[n] >= 0){
m1 = fun(n-1,m - weight[n]) + value[n];
}
//不装入
int m2 = fun(n-1,m);
//两者的最大值
return m1 > m2? m1:m2;
}
//方法二:不用递归
public int fun2(int[] weight,int[] value,int k,int w){ // 4 8
//可能遇到f(0,x)之类的,所以
int[][] arr = new int[k+1][w+1];
for(int i = 1;i <= k;i++){//次数
for(int j = 1;j <= w;j++){//重量
int m1 = 0;
if(j >= weight[i-1]){//偷
m1 = arr[i-1][j - weight[i-1]] + value[i-1];
}
int m2 = arr[i-1][j];//不偷
arr[i][j] = m1 > m2? m1:m2;
}
}
// for(int i = 1;i <= k;i++){//次数
// for(int j = 1;j <= w;j++){//重量
// System.out.printf("f[%d][%d]=%d\n",i,j,arr[i][j]);
// }
// }
return arr[k][w];
}
}