解析:
如果正常的0/1背包,体积过大,写不出来
正常的f[i] 表示:选第i件物品最大价值
由于题目给出体积超过1e6
所以我们要反过来想0/1背包
我们设f[i]表示装价值i需要最小的容量是多少。
dp一下。最后我们只要判断最小的容量f[i]<=题目要求的容量即可
#include<bits/stdc++.h>
using namespace std;
int t;
const int N=1e5+1000;
int w[N],v[N],n,m;
int f[N];
int main()
{
cin>>t;
while(t--)
{
scanf("%d %d",&n,&m);
memset(f,0x3f,sizeof f);
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&w[i],&v[i]);
sum+=v[i];
}
f[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=v[i];j--)
{
f[j]=min(f[j],f[j-v[i]]+w[i]);
}
}
for(int i=sum;i>=0;i--)
{
if(f[i]<=m)
{
cout<<i<<endl;
break;
}
}
}
}