E20 背包DP 求具体方案

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

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

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

int main(){
  int n,m; cin>>n>>m;
  for(int i=1; i<=n; i++) cin>>v[i]>>w[i];
  
  for(int i=n; i>=1; i--)   //逆序取物 
  for(int j=0; j<=m; j++){  //枚举体积
    f[i][j]=f[i+1][j];
    p[i][j]=j;              //记录路径列 
    if(j>=v[i])
      f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);
    if(j>=v[i] && f[i][j]==f[i+1][j-v[i]]+w[i])
      p[i][j]=j-v[i];
  }
  
  int j=m;
  for(int i=1; i<=n; i++)
    if(p[i][j]<j){
      printf("%d ",i);
      j=p[i][j];
    }
}
#include<iostream>
#include<cstring>
using namespace std;

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

int main(){
  int n,m; cin>>n>>m;
  for(int i=1; i<=n; i++) cin>>v[i]>>w[i];
  
  for(int i=n; i>=1; i--)
  for(int j=m; j>=0; j--){
    p[i][j]=j;
    if(j>=v[i])
      f[j]=max(f[j],f[j-v[i]]+w[i]);
    if(j>=v[i]&&f[j-v[i]]+w[i]==f[j])
      p[i][j]=j-v[i];
  }
  
  int j=m;
  for(int i=1; i<=n; i++)
    if(p[i][j]<j){      
      printf("%d ",i);
      j=p[i][j];
    }
}

 

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