代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int w,n;
void bag(vector<vector<int>>&dp,vector<int>&value,vector<int>&weight,vector<int>&numb){
for(int i=1;i<=n;i++){
for(int j=w;j>0;j--){
if(j>=weight[i])dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
else dp[i][j]=dp[i-1][j];
}
/*for(int j=0;j<=w;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;*/
}
int t=0;
int numi=n,numj=w;
for(;numi>=1;numi--){
int sum=0;
for(int i=numi,j=w;i>=1;i--){
if(dp[i][j]!=dp[i-1][j]){
numb.emplace_back(i);
sum+=weight[i];
j=j-weight[i];//回去
}
}
if(sum!=w){
vector<int>().swap(numb);
}else{
t=1;
break;
}
}
if(t){
sort(numb.begin(),numb.end());
for(auto &x:numb){
cout<<x<<" ";
}
cout<<endl<<dp[numi][numj];
}else cout<<"No"<<endl<<0;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>w;
vector<vector<int>>dp(n+1,vector<int>(w+1,0));
int wi,vi;
vector<int>weight(n+1,0);
vector<int>value(n+1,0);
for(int i=1;i<=n;i++){
cin>>wi>>vi;
weight[i]=wi;
value[i]=vi;
}
vector<int>numb;
bag(dp,value,weight,numb);
return 0;
}