E08【模板】背包DP 01背包

E08【模板】背包DP 01背包_哔哩哔哩_bilibili

 

P2871 [USACO07DEC] Charm Bracelet S - 洛谷

$f_{i,j}$ 表示前 $i$ 个物品,容量为 $j$ 的背包所能达到的最大价值
$$f_{i,j}  =max(f_{i-1,j},f_{i-1,j-v_i}+w_i) $$
可以用滚动数组 或 逆序枚举 $j$,去掉第一维,
$$f_{j}  =max(f_{j},f_{j-v_i}+w_i) $$

// 空间未优化 MLE
#include<bits/stdc++.h>
using namespace std;

const int N=3410,M=13000;
int n,m;
int v,w,f[N][M];

int main(){
  scanf("%d%d",&n,&m);

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

 

// 滚动数组优化空间
#include<bits/stdc++.h>
using namespace std;

const int N=3410,M=13000;
int n, m;
int v,w,f[2][M];

int main(){
  scanf("%d%d",&n,&m);
    
  for(int i=1; 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&1][j-v]+w); //奇偶滚动
    }
  }
  printf("%d\n",f[n&1][m]);
}

 

// 逆序枚举,优化空间
#include<bits/stdc++.h>
using namespace std;

const int M=13000;
int n,m;
int v,w,f[M];

int main(){
  scanf("%d%d",&n,&m);

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

 

P1048 [NOIP 2005 普及组] 采药 - 洛谷

#include<bits/stdc++.h>
using namespace std;

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

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

 

P1049 [NOIP 2001 普及组] 装箱问题 - 洛谷

#include<bits/stdc++.h>
using namespace std;

int m,n;
int v,f[20005];

int main(){
  scanf("%d%d",&m,&n);

  for(int i=1;i<=n;i++){
    scanf("%d",&v);
    for(int j=m;j>=v;j--){
      f[j]=max(f[j],f[j-v]+v);
    }
  }
  
  printf("%d\n",m-f[m]);
}

 

P1060 [NOIP 2006 普及组] 开心的金明 - 洛谷

#include<bits/stdc++.h>
using namespace std;

int n,m;
int v,w,f[30005];

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

 

P2639 [USACO09OCT] Bessie's Weight Problem G - 洛谷

P7223 [RC-04] 01 背包 - 洛谷

01背包问题 - 题单 - 洛谷 | 计算机科学教育新生态

动态规划——01背包问题_动态规划01背包问题-CSDN博客

每周一算法:背包问题(五)求解方案数_背包问题求方案数-CSDN博客

背包九讲——背包问题求方案数_1.给定n种物品和一个背包。物品i的重量是w[i],其价值为v[i],背包的容量为c。应如-CSDN博客

 

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