正题
题目大意
完全背包,不过容量特别大。
解题思路
然后我们可以先做一个1∼200001\sim 200001∼20000的背包,然后枚举一个大小,然后将这个大小填入背包知道无法填入为止,然后剩下的空位在再一次背包就好。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,m,b[110],f[21000],ans;
int main()
{freopen("backpack.in","r",stdin);freopen("backpack.out","w",stdout);scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){ll x,y;scanf("%lld%lld",&x,&y);b[x]=max(b[x],y);}for(ll i=1;i<=100;i++)for(ll j=i;j<=20000;j++)f[j]=max(f[j],f[j-i]+b[i]);for(ll i=1;i<=20000;i++)ans=max(ans,(m-100)/i*f[i]+f[m%i+100]);printf("%lld",ans);
}