E20 背包DP 求具体方案

E20 背包DP 求具体方案_哔哩哔哩_bilibili

 

U519807 01背包求具体方案 - 洛谷

T573743 背包问题求具体方案 - 洛谷

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

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

int main(){
  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];
      if(j>=v[i])f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);
    }
  }
  
  int j=m,cnt=0;
  for(int i=1;i<=n;i++){
    if(j>=v[i]&&f[i][j]==f[i+1][j-v[i]]+w[i]){
      path[++cnt]=i;
      j-=v[i];
    }
  }
  cout<<cnt<<endl;
  for(int i=1;i<=cnt;i++) cout<<path[i]<<" ";
}

 

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

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

int main(){
  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){
    ans[++cnt]=i;
    j=p[i][j];
  }
  cout<<cnt<<endl;
  for(int i=1;i<=cnt;i++) cout<<ans[i]<<" ";
}

 

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