【链接】
bzoj5018
【解题报告】
背包。
#include<cstdio>
#include<algorithm>
#define LL long long
#define LD long double
using namespace std;
const int maxn=125,maxv=25005;
int n,alv,ans,s[maxn],w[maxn];
LL m;
LD f[maxn][maxv];
int main()
{
freopen("5018.in","r",stdin);
freopen("5018.out","w",stdout);
scanf("%d%lld",&n,&m); alv=0; ans=0;
for (int i=1; i<=n; i++) scanf("%d",&s[i]);
for (int i=1; i<=n; i++) scanf("%d",&w[i]),alv+=s[i]*w[i];
f[0][0]=1;
for (int i=1; i<=n; i++)
for (int j=0; j<=alv; j++)
{
f[i][j]=f[i-1][j];
for (int k=1; k<=s[i]; k++)
if (k*w[i]>j) break;
else f[i][j]=min((LD)m,max(f[i][j],f[i-1][j-k*w[i]]*(LD)k));
}
while (f[n][ans]!=m) ans++;
printf("%d",ans);
return 0;
}