← Home
Looking at this problem, I need to find the probability that:
1. I win at least `l` tours
2. I can fit all huge prizes into bags (won bags + brought bags with capacity `k`)

For each tour `i`:
- If I win tour `i` and `a[i] == -1`: I get a huge prize (need +1 bag space)
- If I win tour `i` and `a[i] != -1`: I get a bag with capacity `a[i]` (gain `a[i]` bag space)
- If I lose tour `i`: nothing happens

I need to track two things: number of wins and net bag capacity. The "balance" is: `k + sum of a[i] for won bag tours - count of won prize tours >= 0`.

Let me define the net contribution of winning tour `i`:
- If `a[i] == -1`: contribution = -1 (need one more space)
- If `a[i] != -1`: contribution = a[i] (gain space)

I need to track: (number of wins, total bag capacity balance).

The capacity balance starts at `k`, and for each won tour adds the contribution. I need balance >= 0 at the end, and wins >= l.

Since `n` can be 200 and `a[i]` up to 200, the capacity can range widely. But I can cap it since if capacity exceeds `n` (max possible huge prizes is `n`), we don't need to track higher. Similarly, if it goes below `-n`, it can never recover enough.

Let me use DP: `dp[j][c]` = probability of having `j` wins and net capacity `c` after processing tours so far. I'll offset `c` by `n` to handle negatives (capacity ranges from `-n` to some max, but I'll cap at `n` since we can never need more than `n` capacity).

So capacity range: `-n` to `n`, offset by `n`, giving indices `0` to `2n`.

```go
package main

import (
	"fmt"
)

func main() {
	var n, l, k int
	fmt.Scan(&n, &l, &k)

	p := make([]float64, n)
	a := make([]int, n)

	for i := 0; i < n; i++ {
		var x int
		fmt.Scan(&x)
		p[i] = float64(x) / 100.0
	}
	for i := 0; i < n; i++ {
		fmt.Scan(&a[i])
	}

	// dp[wins][capacity_offset] = probability
	// capacity offset: actual capacity + n (so index n means capacity 0)
	maxCap := n
	capSize := 2*n + 1
	// cap ranges from -n to n, but we clamp

	clamp := func(c int) int {
		if c < -n {
			return -n
		}
		if c > maxCap {
			return maxCap
		}
		return c
	}

	dp := make([][]float64, n+1)
	for j := 0; j <= n; j++ {
		dp[j] = make([]float64, capSize)
	}

	// Initial state: 0 wins, capacity = k (clamped)
	initCap := clamp(k)
	dp[0][initCap+n] = 1.0

	for i := 0; i < n; i++ {
		ndp := make([][]float64, n+1)
		for j := 0; j <= n; j++ {
			ndp[j] = make([]float64, capSize)
		}

		var contrib int
		if a[i] == -1 {
			contrib = -1
		} else {
			contrib = a[i]
		}

		for j := 0; j <= i; j++ {
			for c := 0; c < capSize; c++ {
				if dp[j][c] == 0 {
					continue
				}
				prob := dp[j][c]
				// Lose tour i
				ndp[j][c] += prob * (1 - p[i])
				// Win tour i
				newCap := clamp((c - n) + contrib)
				ndp[j+1][newCap+n] += prob * p[i]
			}
		}

		dp = ndp
	}

	var ans float64
	for j := l; j <= n; j++ {
		for c := 0; c < capSize; c++ {
			actualCap := c - n
			if actualCap >= 0 {
				ans += dp[j][c]
			}
		}
	}

	fmt.Printf("%.10f\n", ans)
}
```