01背包的记忆化搜索版本
2. 01背包问题 - AcWing题库
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
int dp[maxn][maxn];
int n,W,w[maxn],v[maxn];
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]=res;
}
void solve(){
cin>>n>>W;
for(int i=0;i<n;++i){
cin>>w[i]>>v[i];
}
//用-1表示尚未计算过,初始化整个数组
memset(dp,-1,sizeof dp);
cout<<rec(0,W)<<endl;
}
int main(){
solve();
return 0;
}