如果按照正常解法求解 01 背包问题,一定会超时,先按照性价比选择,减少背包的容量,这样再用一次 01 背包解决问题即可
const int N=2e5+5;
int i,j,k;
int n,m,t;
ll dp[100+5];
struct Node
{
ll w,v;
}a[N];
bool cmp(Node a,Node b)
{
return a.v*b.w>a.w*b.v;
}
int main()
{
//IOS;
while(~sdd(n,m)){
for(int i=1;i<=n;i++) sll(a[i].w),sll(a[i].v);
sort(a+1,a+1+n,cmp);
int cur=0;
ll ans=0;
for(int i=1;i<=n && m>=100;i++){
ans+=a[i].v;
m-=a[i].w;
cur=i;
}
ms(dp,0);
for(int i=cur+1;i<=n;i++){
for(int j=m;j>=a[i].w;j--){
dp[j]=max(dp[j],dp[j-a[i].w]+a[i].v);
}
}
pll(ans+dp[m]);
}
//PAUSE;
return 0;
}