#include <bits/stdc++.h>
using namespace std;
int M,N;
int volume[5002];
int value[5002];
int dp[5002][5002]={0};// 前i个物品 背包容积为j 最大价值
int main()
{
cin>>M>>N;
for(int i=0;i<M;i++){
cin>>volume[i];
}
for(int i=0;i<M;i++){
cin>>value[i];
}
//初始化
for(int i=0;i<M;i++)
dp[i][0]=0;
for(int i=volume[0];i<=N;i++){
dp[0][i]=value[0];
}
//遍历物品
for(int i=1;i<M;i++){
//遍历容积
for(int j=1;j<=N;j++){
//如果放不下当前的物品
if(j<volume[i])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]);
}
}
cout<<dp[M-1][N];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int M,N;
int value[5002];
int volume[5002];
int dp[5002];//背包体积为j的最大价值
int main()
{
cin>>M>>N;
for(int i=0;i<M;i++){
cin>>volume[i];
}
for(int i=0;i<M;i++){
cin>>value[i];
}
dp[0]=0;
//遍历物品
for(int i=0;i<M;i++){
//遍历体积
for(int j=N;j>=volume[i];j--){
dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
}
}
cout<<dp[N];
}
class Solution {
public:
bool canPartition(vector<int>& nums) {
int dp[10001]={0};//背包总容量为j 放进物品后的最大重量
dp[0]=0;
int sum=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
}
int target=sum/2;
if (sum % 2 == 1) return false;
for(int i=0;i<nums.size();i++){
for(int j=target;j>=nums[i];j--){
dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
return dp[target]==target;
}
};