E16 背包DP 分组背包

视频链接:https://www.bilibili.com/video/BV16a411w77X/

// 分组背包 朴素算法
#include<iostream>
#include<cstring>
using namespace std;

const int N=110;
int v[N][N],w[N][N],s[N];
// v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数
int f[N][N];
// f[i,j]:前i组物品,能放入容量为j的背包的最大值

int main(){    
  int n,V; cin>>n>>V;
  for(int i=1;i<=n;i++){
    cin>>s[i];
    for(int j=1;j<=s[i];j++) cin>>v[i][j]>>w[i][j];
  }
  
  for(int i=1;i<=n;i++)     //物品
  for(int j=1;j<=V;j++)     //体积
  for(int k=0;k<=s[i];k++)  //同组内的物品只能选一个
    if(j>=v[i][k]) f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);                 

  cout<<f[n][V];
}
// 分组背包 朴素算法 空间优化
#include<iostream>
#include<cstring>
using namespace std;

const int N=110;
int f[N],v[N],w[N];

int main(){
  int n,V,s; cin>>n>>V;
  for(int i=1;i<=n;i++){  //物品
    cin>>s;
    for(int j=1;j<=s;j++) cin>>v[j]>>w[j];      
              
    for(int j=V;j>=1;j--) //体积
    for(int k=0;k<=s;k++) //个数
      if(j>=v[k]) f[j]=max(f[j],f[j-v[k]]+w[k]);
  }
  cout<<f[V];
}

Luogu P1757 通天之分组背包

#include<iostream>
#include<cstring>
using namespace std;

const int N=1010;
int v[N][N],w[N][N],s[N];
// v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数
int f[N];
// f[i,j]:前i组物品,能放入容量为j的背包的最大值

int main(){
  int n,V,a,b,c,mx=0; cin>>V>>n;
  for(int i=1;i<=n;i++){
    cin>>a>>b>>c;
    v[c][++s[c]]=a; w[c][s[c]]=b; mx=max(mx,c);
  }
  
  for(int i=1;i<=mx;i++)    //
  for(int j=V;j>=1;j--)     //体积
  for(int k=0;k<=s[i];k++)  //个数
    if(j>=v[i][k]) f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);                 

  cout<<f[V];
}

Luogu P1064 [NOIP2006 提高组] 金明的预算方案

#include<iostream>  
using namespace std;

const int N=33000;
int n,W,v,p,q;
int mw[N],mv[N],fw[N][3],fv[N][3];
int f[N];

int main(){  
  cin>>W>>n;      //W总重量,n总个数
  for(int i=1;i<=n;i++){  
    cin>>v>>p>>q;  
    if(!q){
      mw[i]=v;    //主件重量
      mv[i]=v*p;  //主件价值
    }  
    else{ 
      fw[q][0]++;           //附件个数
      fw[q][fw[q][0]]=v;    //fw附件重量
      fv[q][fw[q][0]]=v*p;  //fv附件价值
    }
  }
  
  for(int i=1;i<=n;i++)                 //物品
    for(int j=W;j>=mw[i];j--){          //体积
      f[j]=max(f[j],f[j-mw[i]]+mv[i]);  //只选m
      if(j>=mw[i]+fw[i][1])             //选m,a
        f[j]=max(f[j],f[j-mw[i]-fw[i][1]]+mv[i]+fv[i][1]);
      if(j>=mw[i]+fw[i][2])             //选m,b
        f[j]=max(f[j],f[j-mw[i]-fw[i][2]]+mv[i]+fv[i][2]); 
      if(j>=mw[i]+fw[i][1]+fw[i][2])    //选m,a,b
        f[j]=max(f[j],f[j-mw[i]-fw[i][1]-fw[i][2]]+mv[i]+fv[i][1]+fv[i][2]);  
    }  
  cout<<f[W]; 
}

 

posted @ 2023-04-10 10:01  董晓  阅读(536)  评论(1编辑  收藏  举报