fn partitions(n: usize) -> Vec<Vec<usize>> {
// Inner recursive function that builds partitions.
// remaining — how much is left to sum to n
// start — the minimum next value allowed (enforces non-decreasing order)
// current — the partial partition being built
// result — all completed partitions
fn backtrack(
remaining: usize,
start: usize,
current: &mut Vec<usize>,
result: &mut Vec<Vec<usize>>,
) {
// If nothing is left, we found a valid partition
if remaining == 0 {
result.push(current.clone()); // clone because current will be modified later
return;
}
// Try all possible next values from `start` up to `remaining`
for i in start..=remaining {
current.push(i); // choose i
backtrack(remaining - i, i, current, result); // recurse with reduced remainder
current.pop(); // undo the choice (backtrack)
}
}
let mut result = Vec::new();
let mut current = Vec::new();
// Start building partitions with minimum allowed value = 1
backtrack(n, 1, &mut current, &mut result);
result
}
fn main() {
let n = 5;
for p in partitions(n) {
println!("{:?}", p);
}
}
/*
run:
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]
*/