E09【模板】背包DP 完全背包
E09【模板】背包DP 完全背包_哔哩哔哩_bilibili
$f_{i,j}$ 表示前 $i$ 种物品,容量为 $j$ 的背包所能达到的最大价值
$$ f_{i,j}=\max\limits_{0\leq k \leq j/v}(f_{i,j},f_{i-1,j-k\cdot v}+k\cdot w) $$
可以用滚动数组 或 正序枚举 $j$,去掉第一维,
$$ f_{j}=max(f_{j},f_{j-v}+w) $$
// 朴素算法 TLE #include<bits/stdc++.h> using namespace std; const int N=1010; int n,m; int f[N][N]; int main(){ scanf("%d%d",&n,&m); for(int i=1,v,w; i<=n; i++){ //枚举物品 scanf("%d%d",&v,&w); for(int j=0; j<=m; j++){ //枚举体积 for(int k=0; k<=j/v; k++){ //枚举个数 f[i][j]=max(f[i][j],f[i-1][j-k*v]+k*w); } } } printf("%d\n",f[n][m]); }
// 优化决策+滚动数组优化空间 #include<bits/stdc++.h> using namespace std; const int N=1010; int n,m; int f[2][N]; int main(){ scanf("%d%d",&n,&m); for(int i=1,v,w; i<=n; i++){ //枚举物品 scanf("%d%d",&v,&w); for(int j=1; j<=m; j++){ //枚举体积 if(j<v) f[i&1][j]=f[i-1&1][j]; else f[i&1][j]=max(f[i-1&1][j],f[i&1][j-v]+w); } } printf("%d\n",f[n&1][m]); }
// 优化决策+优化空间 #include<bits/stdc++.h> using namespace std; const int N=1010; int n,m; int f[N]; int main(){ scanf("%d%d",&n,&m); for(int i=1,v,w; i<=n; i++){ //枚举物品 scanf("%d%d",&v,&w); for(int j=v; j<=m; j++){ //枚举体积 f[j]=max(f[j],f[j-v]+w); } } printf("%d\n",f[m]); }
// 优化决策+优化空间 #include<bits/stdc++.h> using namespace std; const int N=1e7+5; int n,m,v,w; long long f[N]; int main(){ scanf("%d%d",&m,&n); for(int i=1; i<=n; i++){ //枚举物品 scanf("%d%d",&v,&w); for(int j=v; j<=m; j++) //枚举体积 f[j]=max(f[j],f[j-v]+w); } printf("%lld\n",f[m]); }
P2722 [USACO3.1] 总分 Score Inflation - 洛谷
浙公网安备 33010602011771号