完全背包,但是要经过一次优化。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,ans,w[105],v[105],dp[100005],vis[100005];
int main()
{
while(cin>>n>>m)
{
if(n==0&&m==0)
{
break;
}
for(int i=1;i<=n;i++)
cin>>w[i];
for(int i=1;i<=n;i++)
cin>>v[i];
memset(dp,0,sizeof(dp));
dp[0]=1;//
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
vis[j]=0;
for(int k=w[i];k<=m;k++)
if(!dp[k]&&dp[k-w[i]]&&vis[k-w[i]]<v[i])
dp[k]=1,vis[k]=vis[k-w[i]]+1;
}
ans=0;
for(int i=1;i<=m;i++)
if(dp[i])
ans++;
cout<<ans<<endl;
}
return 0;
}