先用DP算出最优的价值,再使用bfs寻找满足这个最优的价值和体积的编号,行吧?我这样写,应该是可以的吧? 求助,大佬们!
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
typedef long long ll;
int f[N],w[N],v[N];
string res;
int n,m;
struct node{
string way;
int index;
int sum;
};
void bfs()
{
queue<node> q;
node t;
t.way="";
t.sum=0;
t.index=0;
q.push(t);
while(!q.empty())
{
node now=q.front();
q.pop();
//printf("index=%d sum=%d \n",now.index,now.sum);
//cout<<now.way<<endl<<endl;
if(now.sum==f[m])
{
int len=now.way.length();
int t_w=0;
for(int i=0;i<len;i++)
t_w+=w[now.way[i]-'0'];
if(t_w<=m)
{
res=now.way;
break;
}
}
else
{
for(int i=1+now.index;i<=n;i++)
{
node temp=now;
temp.way+=(i+'0');
temp.sum=now.sum+v[i];
temp.index=i;
q.push(temp);
}
}
}
int len=res.length();
for(int i=0;i<len;i++)
printf("%c ",res[i]);
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d%d",&w[i],&v[i]);
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
printf("%lld\n",f[m]);
bfs();
return 0;
}