1.题目
给定两个数组weights[]和values[]
分别表示每个物体的重量和价值
当背包容量一定时
在不超出背包容量的前提下
背包所装物品的最大价值为多少
2.暴力递归方法
思路:根据自然思维的尝试写出能返回背包最大价值的方法,并进行递归。
public static int maxValue(int[] weights,int[] values,int bag) {
//首先排除干扰项 没给物品质量 没给物品价值 背包容量小于0
if(weights.length!=values.length ||weights==null||values==null||bag<0) {
return 0;
}
return process(weights,values,0,bag);
}
//写尝试
public static int process(int[] w,int[] v,int index,int bag) {
//base情况
if(bag<0) {
return -1;
}
if(index==w.length) {
return 0;
}
int p1 = process(w,v,index+1,bag);
int p2=0;
//首先判断next是否为无效值
int next = process(w,v,index+1,bag-w[index]);
if(next!=-1) {
p2=next+v[index];
}
return Math.max(p1, p2);
}
3.暴力递归->动态规划
public static int process2(int[] w, int[] v, int N, int bag) {
int[][] dp = new int[N + 1][bag + 1];
for (int index = N - 1; index >= 0; index--) {
for (int rest = 0; rest <= bag; rest++) {
int p1 = dp[index + 1][rest];
int p2 = 0;
int next = rest - w[index] < 0 ? -1 : dp[index + 1][rest - w[index]];
if (next != -1) {
p2 = v[index] + next;
}
dp[index][rest] = Math.max(p1, p2);
}
}
return dp[0][bag];
}