//配列の使い回し. #include using namespace std; #define int long long int N,D,K; signed main(){ cin>>N>>D>>K; vector A(N); vector C(N); for(int i = 0; i < N; i++) cin>>A[i]; for(int i = 0; i < N; i++) cin>>C[i]; vector>> dp(2,vector>(D+1,vector(K+1,-(1e18)))); dp[0][0][0] = 0; for(int i = 0; i < N; i++){ for(int j = 0; j <= D; j++){ for(int k = 0; k <= K; k++){ if(dp[i%2][j][k] == -(1e18)) continue; dp[(i+1)%2][j][k] = max(dp[(i+1)%2][j][k],dp[i%2][j][k]); if(j == D) continue; dp[(i+1)%2][j+1][min(k+C[i],K)] = max(dp[(i+1)%2][j+1][min(k+C[i],K)],dp[i%2][j][k] + A[i]); } } } if(dp[N%2][D][K] == -(1e18)) cout << "No" << endl; else cout << dp[N%2][D][K] << endl; }