#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 107
using namespace std;
int n,m;
int c[MAX];
int v[MAX];
int dp[100007];
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &m ) , n+m )
{
for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &c[i] );
for ( int i = 1 ; i <= n ; i++ ) scanf ( "%d" , &v[i] );
memset ( dp , 0 , sizeof ( dp ) );
dp[0] = 1;
for ( int i = 1 ; i <= n ; i++ )
{
if ( v[i]*c[i] >= m )
{
for ( int j = c[i] ; j <= m ; j++ )
if ( dp[j-c[i]] ) dp[j] = 1;
continue;
}
int k = 1 ;
while ( k < v[i] )
{
for ( int j = m ; j >= k*c[i] ; j-- )
if ( dp[j-k*c[i]] ) dp[j] = 1;
v[i] -= k;
k<<=1;
}
for ( int j = m ; j >= v[i]*c[i] ; j-- )
if ( dp[j-v[i]*c[i]] ) dp[j] =1;
}
int ans = 0;
for ( int i = 1 ; i <= m ; i++ )
if ( dp[i] ) ans++;
printf ( "%d\n" , ans );
}
}
hdu 2844 多重背包
最新推荐文章于 2024-10-01 18:52:56 发布