二刷提高课,题解目录在这里— 提高课的题解目录
背包问题求具体方案数其实就是再将背包遍历一遍,当就是从该点转移过来时就选取这个物品
因为这里要求是字典序最小所以这里是倒序遍历
注意当比较时不能只单纯比较要或不要而是要拿f[i][j]与其比较
因为如果单纯比较拿与不拿对于倒数第二个肯定是拿要大一点
但是总体看来可能不选更为划算所以要从全局的来看
#include<iostream>
using namespace std;
int f[1010][1010];
int v[1010],w[1010];
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=1;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;
for(int i=1;i<=n;i++)
if(j>=v[i]&&f[i][j]==f[i+1][j-v[i]]+w[i])
{
cout<<i<<" ";
j-=v[i];
}
return 0;
}