为什么要用二维数组进行纪录?
记忆化最麻烦的还是记忆值的准确性
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
long long w,v;
}d[10000];
long long n,m;
long long dp[1000][1000];
/*
一开始我直接使用的dp[1000000],以为将每个m对应的最优解存下就行了,但是不行,每个i对应的m都有意义。
并且对于dp[m]一开始存储的值不一定是最优解。
举例:
当 m=10时
0 1 6 8 为最优解
但是dp[m]一开始并不一定是赋值这个,一开始dp[m]被赋值为第一次m=10时对应的dp[i][m]的最优解
因此如果使用该dp[m]进行更新其余值,只会一错再错。
*/
long long solve(int m,int i){
long long res=0;
if(i>=n)return 0;
if(dp[i][m])return dp[i][m];
else {
if(m>=d[i].w)
res=max(d[i].v+solve(m-d[i].w,i+1),solve(m,i+1));
else res=solve(m,i+1);
dp[i][m]=max(dp[i][m],res);
}
return dp[i][m];
}
int main(){
cin>>m;//背包的容量
cin>>n;//物品数目
for(int i=0;i<n;i++){
cin>>d[i].w>>d[i].v;//重量,价值
}
solve(m,0);
cout<<dp[0][m];
return 0;
}