通过递推来实现
将整个表格都记忆下来
反向dp
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>//关于字符的
using namespace std;
int res;
int dp[110][110];//记忆化数组
int n,W;int w[110]={0}; int v[110]={0};
int max(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>w[i]>>v[i];
}
cin>>W;
memset(dp,0,sizeof(dp));
for(int i=n-1;i>=0;i--){
for(int j=0;j<=W;j++){
if(j<w[i]){
dp[i][j]=dp[i+1][j];
}
else{
dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
}
}
}
printf("%d\n",dp[0][W]);
}
正向dp
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>//关于字符的
using namespace std;
int res;
int dp[110][110];//记忆化数组
int n,W;int w[110]={0}; int v[110]={0};
int max(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>w[i]>>v[i];
}
cin>>W;
memset(dp,0,sizeof(dp));
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]);
}
}
}
printf("%d\n",dp[n][W]);
}