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

视频链接:409【模板】背包DP 完全背包_哔哩哔哩_bilibili

 

// 朴素算法 TLE
#include <iostream>
#include <algorithm>
using namespace std;

const int N=1010;
int n, m;
int v[N], w[N];
int f[N][N];

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; i++) 
    scanf("%d%d",&v[i],&w[i]);  //费用,价值
  
  for(int i=1; i<=n; i++)       //阶段:枚举物品
  for(int j=0; j<=m; j++)       //状态:枚举体积
  for(int k=0; k<=j/v[i]; k++)  //决策:枚举个数
    f[i][j]=max(f[i][j], f[i-1][j-v[i]*k]+w[i]*k);
  
  printf("%d\n",f[n][m]);
}
// 优化决策
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=1010;
int n, m;
int v[N],w[N],f[N][N];

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; i++) 
    scanf("%d%d",&v[i],&w[i]);  //费用,价值
  
  for(int i=1; i<=n; i++)       //枚举物品
    for(int j=1; j<=m; j++)     //枚举体积
      if(j<v[i]) f[i][j]=f[i-1][j];
      else f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);         
      
  printf("%d\n",f[n][m]);
}
// 优化决策+滚动数组优化空间
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=1010;
int n, m;
int v[N],w[N],f[2][N];

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; i++) 
    scanf("%d%d",&v[i],&w[i]);  //费用,价值
  
  for(int i=1; i<=n; i++)       //枚举物品
    for(int j=1; j<=m; j++)     //枚举体积
      if(j<v[i]) 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[i]]+w[i]);         
      
  printf("%d\n",f[n&1][m]);
}
// 优化决策+优化空间
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=1010;
int n, m;
int v[N],w[N],f[N];

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; i++) 
    scanf("%d%d",&v[i],&w[i]);  //费用,价值
  
  for(int i=1; i<=n; i++)       //枚举物品
    for(int j=v[i]; j<=m; j++)  //枚举体积
      f[j]=max(f[j],f[j-v[i]]+w[i]);
      
  printf("%d\n",f[m]);
}

 

Luogu P1616 疯狂的采药

// 滚动数组
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=1e4+5,M=1e7+5;
long long v[N],w[N],f[2][M];

int main(){
  int n, m; scanf("%d%d",&m,&n);
  for(int i=1; i<=n; i++) 
    scanf("%d%d",&v[i],&w[i]);  //费用,价值
  
  for(int i=1; i<=n; i++)       //枚举物品
    for(int j=1; j<=m; j++)     //枚举体积
      if(j<v[i]) 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[i]]+w[i]);         
      
  printf("%lld\n",f[n&1][m]);
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=1e4+5,M=1e7+5;
long long v[N],w[N],f[M];

int main(){
  int n, m; scanf("%d%d",&m,&n);
  for(int i=1; i<=n; i++) 
    scanf("%d%d",&v[i],&w[i]);  //费用,价值
  
  for(int i=1; i<=n; i++)       //枚举物品
    for(int j=v[i]; j<=m; j++)  //枚举体积
      f[j]=max(f[j],f[j-v[i]]+w[i]);
      
  printf("%lld\n",f[m]);
}

 

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