N = int(input()) T = list(map(int, input().split())) L = list(map(int, input().split())) T.sort(reverse = True) L.sort(reverse = True) SKIPPED = 1 BEST_TIMES =[[-1] * N for _ in (not SKIPPED, SKIPPED)] TOO_LONG = [False] * N def search_best_times(skipped): pre_problem_i = -1 for music_i, time_limit in enumerate(L): if skipped and music_i == 0: continue for problem_i in range(pre_problem_i + 1, N): solve_time = T[problem_i] if solve_time < (T[music_i] if TOO_LONG[music_i] else time_limit): BEST_TIMES[skipped][music_i] = solve_time pre_problem_i = problem_i if music_i == problem_i: TOO_LONG[music_i] = True break search_best_times(not SKIPPED) search_best_times(SKIPPED) def main(): dp = [0, T[0] if TOO_LONG[0] else L[0]] for music_i, time_limit in enumerate(L): if BEST_TIMES[SKIPPED][music_i] > -1: dp[SKIPPED] += BEST_TIMES[SKIPPED][music_i] if music_i > 0 and not TOO_LONG[music_i] and BEST_TIMES[not SKIPPED][music_i] > -1: dp[SKIPPED] = max(dp[SKIPPED], dp[not SKIPPED] + time_limit) if BEST_TIMES[not SKIPPED][music_i] > -1: dp[not SKIPPED] += BEST_TIMES[not SKIPPED][music_i] ans = max(dp) print(ans) if __name__ == "__main__": main()