Rat and Poisoned bottle Problem
Last Updated :
02 Jul, 2025
Given N number of bottles in which one bottle is poisoned. So the task is to find out the minimum number of rats required to identify the poisoned bottle. A rat can drink any number of bottles at a time and if any of the taken bottles is poisonous, then the rat dies and cannot drink anymore.
Examples:
Input: N = 4
Output: 2
Explanation: The minimum number of rats needed to find the poisoned bottle among 4 bottles is 2, using binary representation.
Input: N = 100
Output: 7
Explanation: Since 2⁷ = 128 can cover up to 100 bottles, a minimum of 7 rats is required for identification.
Input: N = 1000
Output: 10
Explanation: The minimum number of rats required is 10, as 210 = 1024 can uniquely identify one poisoned bottle among 1000.
Approach:
Let's start from the base case.
- For 2 bottles: Taking one rat (R1). If the rat R1 drinks the bottle 1 and dies, then bottle 1 is poisonous.
Else the bottle 2 is poisonous. Hence 1 rat is enough to identify.
- For 3 bottles: Taking two rats (R1) and (R2). If the rat R1 drinks the bottle 1 and bottle 3 and dies, then bottle 1 or bottle 3 is poisonous. So the rat R2 drinks the bottle 1 then. If it dies, then the bottle 1 is poisonous, Else the bottle 3 is poisonous.
Now if the rat R1 does not die after drinking from bottle 1 and bottle 3, then bottle 2 is poisonous.
Hence 2 rats are enough to identify.
- For 4 bottles: Taking two rats (R1) and (R2). If the rat R1 drinks the bottle 1 and bottle 3 and dies, then bottle 1 or bottle 3 is poisonous.
So the rat R2 drinks the bottle 1 then. If it dies, then the bottle 1 is poisonous, Else the bottle 3 is poisonous.
Now if the rat R1 does not die after drinking from bottle 1 and bottle 3, then bottle 2 or bottle 4 is poisonous.
So the rat R1 drinks the bottle 2 then. If it dies, then the bottle 2 is poisonous, Else the bottle 4 is poisonous.
Hence 2 rats are enough to identify.
- For N bottles: Minimum number of rats required are = ceil(log2 N).
C++
// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find the minimum number of rats
int minRats(int n)
{
return ceil(log2(n));
}
// Driver Code
int main()
{
// Number of bottles
int n = 1025;
cout << "Minimum " << minRats(n)
<< " rat(s) are required"
<< endl;
return 0;
}
Java
// Java program to implement
// the above approach
class GFG
{
public static double log2(int x)
{
return (Math.log(x) / Math.log(2));
}
// Function to find the minimum number of rats
static int minRats(int n)
{
return (int)(Math.ceil(log2(n)));
}
// Driver Code
public static void main (String[] args)
{
// Number of bottles
int n = 1025;
System.out.println("Minimum " + minRats(n) +
" rat(s) are required");
}
}
Python
# Python3 program to implement
# the above approach
import math
# Function to find the
# minimum number of rats
def minRats(n):
return math.ceil(math.log2(n));
# Driver Code
# Number of bottles
n = 1025;
print("Minimum ", end = "")
print(minRats(n), end = " ")
print("rat(s) are required")
C#
// C# program to implement
// the above approach
using System;
class GFG
{
public static double log2(int x)
{
return (Math.Log(x) / Math.Log(2));
}
// Function to find the minimum number of rats
static int minRats(int n)
{
return (int)(Math.Ceiling(log2(n)));
}
// Driver Code
public static void Main (String[] args)
{
// Number of bottles
int n = 1025;
Console.WriteLine("Minimum " + minRats(n) +
" rat(s) are required");
}
}
JavaScript
// Javascript program to implement
// the above approach
// Function to find the minimum number of rats
function minRats(n)
{
return Math.ceil(Math.log2(n));
}
// Driver Code
// Number of bottles
var n = 1025;
console.log("Minimum " + minRats(n) +
" rat(s) are required");
OutputMinimum 11 rat(s) are required
Time Complexity: O(1)
Auxiliary Space: O(1)
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem