package main

import (
	"container/heap"
	"fmt"
)

type Elem struct {
	Cost  int
	Profi int
}
type MinHeap struct {
	Data []Elem
}

func ConstructMinHeap(e []Elem) *MinHeap {
	return &MinHeap{
		Data: e,
	}
}
func (m MinHeap) Len() int {
	return len(m.Data)
}
func (m MinHeap) Less(i, j int) bool {
	return m.Data[i].Cost < m.Data[j].Cost
}
func (m MinHeap) Swap(i, j int) {
	m.Data[i], m.Data[j] = m.Data[j], m.Data[i]
}
// 弹出在go中写最后,模拟down过程
func (m *MinHeap) Pop() interface{} {
	x := m.Data[len(m.Data)-1]
	m.Data = m.Data[:len(m.Data)-1]
	return x
}
func (m *MinHeap) Push(x interface{}) {
	m.Data = append(m.Data, x.(Elem))
}

func (m *MinHeap) Front() Elem {
	return m.Data[0]
}

type MaxHeap struct {
	Data []Elem
}

func ConstructMaxHeap() *MaxHeap {
	return &MaxHeap{
		Data: make([]Elem, 0),
	}
}
func (m MaxHeap) Len() int {
	return len(m.Data)
}
func (m MaxHeap) Less(i, j int) bool {
	return m.Data[i].Profi > m.Data[j].Profi
}
func (m MaxHeap) Swap(i, j int) {
	m.Data[i], m.Data[j] = m.Data[j], m.Data[i]
}
func (m *MaxHeap) Pop() interface{} {
	x := m.Data[len(m.Data)-1]
	m.Data = m.Data[:len(m.Data)-1]
	return x
}
func (m *MaxHeap) Push(x interface{}) {
	m.Data = append(m.Data, x.(Elem))
}

func main() {
	N, W, K := 0, 0, 0
	for {
		n, _ := fmt.Scan(&N, &W, &K)
		if n == 0 {
			break
		} else {
			cost, profi := make([]int, N), make([]int, N)
			for i := 0; i < N; i++ {
				fmt.Scan(&cost[i])
			}
			for i := 0; i < N; i++ {
				fmt.Scan(&profi[i])
			}
			ele := make([]Elem, N)
			for i := 0; i < N; i++ {
				ele[i] = Elem{Cost: cost[i], Profi: profi[i]}
			}
			// 基于cost构建小根堆
			minheap := ConstructMinHeap(ele)
			heap.Init(minheap)
			// 基于profi构建大根堆
			maxHeap := ConstructMaxHeap()
			heap.Init(maxHeap)

			for K > 0 {
			    // 花费只要小于已有成本,加入到大根堆
				for minheap.Len() > 0 && minheap.Data[0].Cost <= W {
					e := heap.Pop(minheap).(Elem)
					heap.Push(maxHeap, e)
				}
				if maxHeap.Len() == 0 {
					break
				}
			    // 每次从大根堆中弹出利润最大的,累加利润
				e := heap.Pop(maxHeap).(Elem)
				W += e.Profi
				K--
			}
			fmt.Println(W)
		}
	}
}