如果是一维的话,由上层状态转移过来,从大到小枚举体积 否则从小到大枚举
比如01背包问题就是上层转移过来(选前i-1个物品)和分组背包二进制优化
比如完全背包问题就是这一层转移过来(当前i个物品选几个)个分组背包朴素做法
一维
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=10010;
int n,m;
int v[maxn],w[maxn];
int dp[maxn];
int main(){
cin>>n>>m;//n是数量,m是体积
for(int i=1; i<=n; i++){
cin>>v[i]>>w[i];
}
for(int i=1; i<=n; i++){
for(int j=0; j<=m; j++){
if(j>=v[i]){
dp[j]=max(dp[j], dp[j-v[i]]+w[i]);
}
}
}
cout<<dp[m];
return 0;
}
二维
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=10010;
int n,m;
int v[maxn],w[maxn];
int dp[maxn][maxn];
int main(){
cin>>n>>m;//n是数量,m是体积
for(int i=1; i<=n; i++){
cin>>v[i]>>w[i];
}
for(int i=1; i<=n; i++){
for(int j=0; j<=m; j++){
dp[i][j]=dp[i-1][j];
if(j>=v[i]){
dp[i][j]=max(dp[i-1][j], dp[i][j-v[i]]+w[i]);
}
}
}
cout<<dp[n][m];
return 0;
}