代码:
#include<bits/stdc++.h>
using namespace std;
int tot,n,T,w[101],c[101],w1[1501],v1[1501],sum,ans=1e6,res,msk;
int main(){
cin>>n>>T;
for(int i=1;i<=n;i++){
cin>>w[i];
}
for(int i=1;i<=n;i++){
cin>>c[i];
sum+=w[i]*c[i];
}
int dpmulti[sum+1],dpfull[sum-T+1];
for(int i=1;i<=n;i++){
res=c[i];
msk=1;
while(res>msk){
tot++;
v1[tot]=msk;
w1[tot]=msk*w[i];
res-=msk;
msk<<=1;
}
if(res>0){
tot++;
v1[tot]=res;
w1[tot]=res*w[i];
}
}
for(int i=0;i<=sum;i++){
dpmulti[i]=1e7;
dpfull[i]=1e7;
}
dpmulti[0]=0;
dpfull[0]=0;
for(int i=1;i<=tot;i++){
for(int j=sum;j>=w1[i];j--){
if(dpmulti[j-w1[i]]+v1[i]<dpmulti[j]){
dpmulti[j]=dpmulti[j-w1[i]]+v1[i];
}
}
}
for(int i=1;i<=n;i++){
for(int j=w[i];j<=sum-T;j++){
if(dpfull[j-w[i]]+1<dpfull[j]){
dpfull[j]=dpfull[j-w[i]]+1;
}
}
}
for(int i=T;i<=sum;i++){
ans=min(ans,dpmulti[i]+dpfull[i-T]);
}
if(ans==1e6) cout<<-1;
else cout<<ans;
return 0;
}