递归写法
int n,w;
int w[MAX_N],v[MAX_N];
int rec(int i,int 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 res;
}
记忆化搜索写法
int dp[MAX_N + 1][MAX_W + 1];
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()
{
memset(dp,-1,sizeof(dp));
int ans = rec(0,W);
}
dp写法
int dp[MAX_N + 1][MAX_W + 1];
for(int i = 0;i < N;i++)
for(int j = 0;j <= W;j++)
{
if(j < w[i])
dp[i + 1][j] = dp[i][j];
else
dp[i + 1][j] = max(dp[i][j],dp[i][j - w[i]] + v[i]);
}
int ans = dp[N][W];