有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求最大价值
import java.util.*;
public class ll {
static int[] w={2,1,3,2};
static int[] v={3,2,4,2};
static int n=4;
static int W=5;
static int dfs(int i,int ww){//O(2^n)复杂度
if (ww<=0) return 0;//装不进去了
if (i==n) return 0;//0到n-1,没有容量了
int v2=dfs(i+1,ww);//不选
if (ww>=w[i]){
int v1=v[i]+dfs(i+1,ww-w[i]);//选
return Math.max(v1,v2);
}else {
return v2;
}
}
static int m(int i, int ww){//优化,记忆型递归,减少了重复计算
if (ww<=0) return 0;
if (i==n) return 0;
if (rec[i][ww]>=0){
return rec[i][ww];
}
int ans=0;
int v2=m(i+1,ww);
if (ww>=w[i]){
int v1=v[i]+m(i+1,ww-w[i]);
ans=Math.max(v1,v2);
}else {
rec[i][W]=ans;//把之前求出来的结果存起来
return ans;
}
rec[i][ww]=ans;//把之前求出来的结果存起来
return ans;
}
static int rec[][];
public static void main(String[] args) {
int ww=W;
int ans=dfs(0,ww);
System.out.println(ans);
ww=W;
rec=new int[n][W+1];
for (int i = 0; i <n ; i++) {
Arrays.fill(rec[i],-1);
}
ans=m(0,ww);
System.out.println(ans);
}
}