# 808. Soup Servings

## Problem Statement

<br>

There are two types of soup: **type A** and **type B**. Initially, we have `n` ml of each type of soup. There are four kinds of operations:

1. Serve `100` ml of **soup A** and `0` ml of **soup B**,
2. Serve `75` ml of **soup A** and `25` ml of **soup B**,
3. Serve `50` ml of **soup A** and `50` ml of **soup B**, and
4. Serve `25` ml of **soup A** and `75` ml of **soup B**.

When we serve some soup, we give it to someone, and we no longer have it. Each turn, we will choose from the four operations with an equal probability `0.25`. If the remaining volume of soup is not enough to complete the operation, we will serve as much as possible. We stop once we no longer have some quantity of both types of soup.

**Note** that we do not have an operation where all `100` ml's of **soup B** are used first.

Return *the probability that **soup A** will be empty first, plus half the probability that **A** and **B** become empty at the same time*. Answers within `10-5` of the actual answer will be accepted.

&#x20;

**Example 1:**

<pre><code><strong>Input: n = 50
</strong><strong>Output: 0.62500
</strong><strong>Explanation: If we choose the first two operations, A will become empty first.
</strong>For the third operation, A and B will become empty at the same time.
For the fourth operation, B will become empty first.
So the total probability of A becoming empty first plus half the probability that A and B become empty at the same time, is 0.25 * (1 + 1 + 0.5 + 0) = 0.625.
</code></pre>

**Example 2:**

<pre><code><strong>Input: n = 100
</strong><strong>Output: 0.71875
</strong></code></pre>

&#x20;

**Constraints:**

* `0 <= n <= 109`\ <br>

## Intuition

```
As it is given, Prob of both finishing together is 0.5,

Prob of A finishing is 1,
Prob of B finishing is 0

We Can do a DP Where 

We initially start with n,n and reduce the soup 

Dp (i,j) = 0.25 * (dp(i-100,j) + dp(i-75,j-25) + .....)

And return base cases accordingly


Now heres a catch, The solution required is O(n)



Refer this explanation

Basically after a point A's probability will approach 1, 
We need to find such a point 
Where since 0.999995 is considered as 1

So after certain n we get prob as 1

So that n comes out to be 4800




https://leetcode.com/problems/soup-servings/solutions/3831781/hints-to-reach-n-4800-simple-explanation-dp/
```

### Links

<https://leetcode.com/problems/soup-servings/description/>

### Video Links

<https://leetcode.com/problems/soup-servings/solutions/3831781/hints-to-reach-n-4800-simple-explanation-dp/>

### Approach 1:

```
Memoization
```

{% code title="C++" lineNumbers="true" %}

```cpp
class Solution {
public:
    double operation(int a, int b, vector<vector<double>> &dp){
        if(a <= 0 && b <= 0) 
            return 0.5;

        if(b <= 0) 
            return 0;
        
        if(a <= 0) 
            return 1;

        if(dp[a][b] != -1) 
            return dp[a][b];

        double ans =0;
        ans += operation(a-100,b,dp); 
        ans += operation(a-75,b-25,dp); 
        ans += operation(a-50,b-50,dp); 
        ans += operation(a-25,b-75,dp); 

        return dp[a][b] = ans*0.25;
    }
    double soupServings(int n) {
        if(n>4800) return 1;
        vector<vector<double>> dp(n+1,vector<double>(n+1,-1));

        return operation(n,n,dp);
    }
};
```

{% endcode %}

### Approach 2:

```
```

{% code title="C++" lineNumbers="true" %}

```cpp
```

{% endcode %}

### Approach 3:

```
```

{% code title="C++" lineNumbers="true" %}

```cpp
```

{% endcode %}

### Approach 4:

{% code title="C++" lineNumbers="true" %}

```cpp
```

{% endcode %}

### Similar Problems

###


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://coding-9.gitbook.io/untitled/dynamic-programming/general/808.-soup-servings.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
