BackmediumArraystime-and-space-complexitymedium

Ratio Consistent Crates Solution

Problem Statement

Given two integers vials and flasks, and a 2D array crates where each sub-array contains two integers v and f representing the capacity of a crate for vials and flasks, determine the minimum number of crates required such that the ratio of vials to flasks in each crate is consistent with the overall ratio of vials to flasks.

Example 1
Input
[vials = 10, flasks = 20, crates = [[1, 2], [3, 4], [5, 6]]]
Output
2

Explanation: Step-by-step: with input vials = 10, flasks = 20, and crates = [[1, 2], [3, 4], [5, 6]], we calculate the overall ratio of vials to flasks as 10/20 = 1/2. Then, we find the crates that have the same ratio. In this case, crates [1, 2] and [3, 4] and [5, 6] have the same ratio, so we can use 2 crates to achieve the desired ratio.

Example 2
Input
[vials = 15, flasks = 30, crates = [[2, 4], [3, 6], [4, 8]]]
Output
3

Explanation: Step-by-step: with input vials = 15, flasks = 30, and crates = [[2, 4], [3, 6], [4, 8]], we calculate the overall ratio of vials to flasks as 15/30 = 1/2. Then, we find the crates that have the same ratio. In this case, all crates have the same ratio, so we can use 3 crates to achieve the desired ratio.

Constraints

  • 1 <= vials <= 10^6
  • 1 <= flasks <= 10^6
  • 1 <= crates.length <= 10^3
  • 1 <= crates[i][0] <= 10^6
  • 1 <= crates[i][1] <= 10^6
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Ratio Consistent Crates — Problem Statement & Solution Guide

ArraysMediumMixed
TimeO(N * T)
|
SpaceO(T)

Problem Description

Given two integers vials and flasks, and a 2D array crates where each sub-array contains two integers v and f representing the capacity of a crate for vials and flasks, determine the minimum number of crates required such that the ratio of vials to flasks in each crate is consistent with the overall ratio of vials to flasks.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Ratio Consistent Crates"

medium

WHY DOES IT MATTER?

Transforming a ratio constraint into a numeric multiplier converts a seemingly geometric problem into a well‑studied combinatorial optimization (minimum subset sum). Recognizing this pattern lets you apply knapsack techniques instead of reinventing ad‑hoc logic.

OPTIMIZATION CHALLENGE

The breakthrough is the reduction of two‑dimensional capacity checks (v and f) to a single‑dimensional target T = V/p, enabling O(N·T) DP instead of exponential subset enumeration.

REAL-WORLD CONNECTION

Think of shipping containers that must preserve a fixed weight‑to‑volume ratio. Each container type represents a fixed multiple of the base ratio, and the logistics planner must choose the fewest containers to exactly fill a cargo manifest—mirroring the DP formulation.

Always normalize ratios first; it prevents overflow and simplifies the DP state. Also, pre‑filter crates that don’t match the normalized ratio—this cuts both time and memory dramatically.

COMPLEXITY AT A GLANCE

⏱ Time:O(N * T)
💾 Space:O(T)

Core Theory — Why This Approach?

The key insight is to reduce the global ratio V:F to its simplest form p:q by dividing both numbers by their greatest common divisor. Any crate that can be part of a valid solution must have capacities (v, f) that are integer multiples of (p, q); i.e., v = k·p and f = k·q for some positive integer k. This transforms the problem into a classic "minimum‑coins" (or "minimum‑items") subset‑sum: we are given a list of allowed multipliers k (derived from the crates) and we must reach the target sum T = V/p using the fewest k‑values. A naïve exhaustive search enumerates all 2^N subsets and checks their sums, which explodes even for moderate N. The optimal paradigm is a dynamic programming knapsack where dp[x] stores the smallest number of crates needed to achieve a total multiplier x. By iterating over each crate’s k and updating dp from high to low, we obtain the minimum count for the exact target T in O(N·T) time and O(T) space, which is tractable for the medium‑difficulty constraints.

Interview Questions on This Problem

Q1How would you handle the case where the overall ratio V:F is not an integer multiple of any crate’s ratio?

First reduce V:F to its simplest form p:q. Then filter crates to keep only those where v·q == f·p; if none remain, the answer is impossible (e.g., return -1). This early pruning avoids unnecessary DP work.

Q2Can you modify the solution to allow using each crate type an unlimited number of times?

Yes. The DP transition changes to a classic unbounded knapsack: for each k, iterate x from k to T and set dp[x] = min(dp[x], dp[x‑k] + 1). This yields the minimum number of crates when repetitions are allowed.

Q3What trade‑offs arise if you store the full DP table versus only the last row?

Since we only need the minimum count for each sum, a one‑dimensional array of size T+1 suffices, reducing space from O(N·T) to O(T). The time complexity stays O(N·T) because each crate still processes all reachable sums.

Examples

Example 1

Input

[vials = 10, flasks = 20, crates = [[1, 2], [3, 4], [5, 6]]]

Output

2

Explanation: Step-by-step: with input vials = 10, flasks = 20, and crates = [[1, 2], [3, 4], [5, 6]], we calculate the overall ratio of vials to flasks as 10/20 = 1/2. Then, we find the crates that have the same ratio. In this case, crates [1, 2] and [3, 4] and [5, 6] have the same ratio, so we can use 2 crates to achieve the desired ratio.

Example 2

Input

[vials = 15, flasks = 30, crates = [[2, 4], [3, 6], [4, 8]]]

Output

3

Explanation: Step-by-step: with input vials = 15, flasks = 30, and crates = [[2, 4], [3, 6], [4, 8]], we calculate the overall ratio of vials to flasks as 15/30 = 1/2. Then, we find the crates that have the same ratio. In this case, all crates have the same ratio, so we can use 3 crates to achieve the desired ratio.

Constraints

  • 1 <= vials <= 10^6
  • 1 <= flasks <= 10^6
  • 1 <= crates.length <= 10^3
  • 1 <= crates[i][0] <= 10^6
  • 1 <= crates[i][1] <= 10^6

Optimal Approach & Strategy

Reduce the ratio, map each valid crate to its multiplier k, and apply a 1‑D DP (min‑coin knapsack) to compute the smallest number of k’s that sum to T = V/p.

Brute Force Approach

Enumerate every subset of crates, sum their v and f, and check if both sums match V and F while each crate respects the ratio.

Verified Code Solutions

JavaScript Solution
Time: O(N * T)
function solution(vials, flasks, crates) { let overallRatio = vials / flasks; let minCrates = Infinity; for (let i = 0; i < crates.length; i++) { let crateRatio = crates[i][0] / crates[i][1]; if (crateRatio === overallRatio) { let numCrates = Math.ceil(vials / crates[i][0]); minCrates = Math.min(minCrates, numCrates); } } return minCrates; }

Asked in Top Tech Interviews

time-and-space-complexitymediumanalysis

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.