E09【模板】背包DP 完全背包

E09【模板】背包DP 完全背包_哔哩哔哩_bilibili

 

U227266 完全背包问题 - 洛谷

$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]);
}

 

P1616 疯狂的采药 - 洛谷

// 优化决策+优化空间
#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 - 洛谷

 

posted @ 2023-04-10 09:22  董晓  阅读(1232)  评论(0)    收藏  举报