多组输入。
对于每组数据,第一行为两个整数n,m(1 <= n <= 100,1 <= m <= 100000) 。
接下来的一行有n个整数Ai,n个整数Ci(1 <= Ai <= 10000,1 <= Ci <= 1000) 。
文件的最后一行为两个0,代表输入结束。
输出
对于每组数据,输出一行,包含一个整数代表答案。
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
示例输出
8 4
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define LL long long
#define esp 1e9
using namespace std;
int s[100010],nu[100010];
int dp[100010];
int m;
void com(int sp,int c)
{
for(int i=sp;i<=m;i++)
{
dp[i]=max(dp[i],dp[i-sp]+c);
}
}
void on(int sp,int c)
{
for(int i=m;i>=sp;i--)
{
dp[i]=max(dp[i],dp[i-sp]+c);
}
}
void muli(int num,int sp,int c)
{
if(sp*num>=m)
{
com(sp,c);
return;
}
int tem=1;
while(tem<=num)
{
on(tem*c,tem*sp);
num-=tem;
tem<<=1;
}
on(num*c,num*sp);
}
int main()
{
int n,i,j,k;
while(~scanf("%d%d",&n,&m)&&n&&m)
{
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
scanf("%d",&s[i]);
for(i=0;i<n;i++)
scanf("%d",&nu[i]);
for(i=0;i<n;i++)
{
muli(nu[i],s[i],s[i]);
}
int ans=0;
for(i=1;i<=m;i++)
if(dp[i]==i)
ans++;
printf("%d\n",ans);
}
return 0;
}