题目://有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值
static int w[] = {2,1,3,2};
static int v[] = {3,2,4,2};
static int num = 4;
static int bag = 5;
//解法1:
public static void main(String[] args) {
// TODO Auto-generated method stub
//最大承重量
int maxvalue = dfs(5,0);
System.out.println(maxvalue);
}
public static int dfs(int num1,int index) {
if(index==v.length) return 0;
if(num1<=0) return 0;
//不要的时候
int t1 = dfs(num1,index+1);
//要的时候
if(num1>=w[index]) {
int t2 = v[index]+dfs(num1-w[index],index+1);
return Math.max(t1, t2);
}else {
return t1;
}
}
}
//解法二:记忆型递归
public static void main(String[] args) {
// TODO Auto-generated method stub
int rec[][] = new int[num][bag+1];
//先给数据每个赋初值
for(int i=0;i<num;i++) {
Arrays.fill(rec[i], -1);
}
int value = dfs(rec,5,0);
System.out.println(value);
}
public static int dfs(int rec[][],int weight,int index) {
if(weight<=0) return 0;
if(index==4) return 0;
if(rec[index][weight]>=0) //计算之前先查询这个数有没有被赋值过,当它的一个数>=0时,说明这个数已经被赋过值了
return rec[index][weight];
int jilu;
//不要的时候
int t1 = dfs(rec,weight,index+1);
//要的时候
if(weight>=w[index]) {
int t2 = v[index]+dfs(rec,weight-w[index],index+1);
jilu = Math.max(t1, t2);
}else {
jilu = t1;
}
//计算之后再保存
rec[index][weight] = jilu;
return rec[index][weight];
}
}
//解法三:动态规划
public static void main(String[] args) {
// TODO Auto-generated method stub
int dp[][] = new int[num][bag+1];
//给第一行赋初值
for(int i=0;i<bag+1;i++) {
//当0-5的承载量大于每个背包的重量时
if(i>=w[0]) { //要的起的时候
dp[0][i] = v[0];
}else {
dp[0][i] = 0; //要不起的时候
}
}
//给接下来的几行赋值,从第二行开始
for(int i=1;i<num;i++) {
for(int j=0;j<bag+1;j++) {
//要的起的时候
if(j>=w[i]) {
//选择要
int yes = v[i]+dp[i-1][j-w[i]];
//不要的时候 ,直接等于上一行
int no = dp[i-1][j];
dp[i][j] = Math.max(yes, no);
}else { //要不起的时候,直接等于上一行
dp[i][j] = dp[i-1][j];
}
}
}
//最大价值等于最后一个数
System.out.println(dp[num-1][bag]);
}
}