n个重量和价值分别为w, v的物品。找出总重量不超过W 的物品,求所有挑选方案中价值总和的最大值。
n=4;
(w,v)={(2,3),(1,2),(3,4),(2,2)}
W=5;
输出:7 (选0号,1号,3号)
理解:
//n个物品 背包容量W
//int w[max_n],v[max_n]; weight,value;
//暴搜 O(2^n)
int rec(int i,int j){
int res;
if(i==n){
res=0;
}
else if(j<w[i]){
res=rec(i+1,j); //物品重量超重,不选,i++,看下一个
}
else {
res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
} //不超重情况下,每次选或者不选,全部枚举
return res;
}
void sovle(){
cout<<rec(0,W);
}
//记忆化搜索 O(nW)
int dp[max_n][max_n];
int rec(int i,int j){
if(dp[i][j]>=0){
return dp[i][j];
}
int res;
if(i==n){
res=0;
}
else if(j<w[i]){
res=rec(i+1,j);
}
else{
res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
}
return dp[i][j]=