-
Notifications
You must be signed in to change notification settings - Fork 19.5k
/
PowerSum.java
51 lines (46 loc) · 2.05 KB
/
PowerSum.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.thealgorithms.backtracking;
/**
* Problem Statement:
* Find the number of ways that a given integer, N, can be expressed as the sum of the Xth powers
* of unique, natural numbers.
* For example, if N=100 and X=3, we have to find all combinations of unique cubes adding up to 100.
* The only solution is 1^3 + 2^3 + 3^3 + 4^3. Therefore, the output will be 1.
*
* N is represented by the parameter 'targetSum' in the code.
* X is represented by the parameter 'power' in the code.
*/
public class PowerSum {
/**
* Calculates the number of ways to express the target sum as a sum of Xth powers of unique natural numbers.
*
* @param targetSum The target sum to achieve (N in the problem statement)
* @param power The power to raise natural numbers to (X in the problem statement)
* @return The number of ways to express the target sum
*/
public int powSum(int targetSum, int power) {
// Special case: when both targetSum and power are zero
if (targetSum == 0 && power == 0) {
return 1; // by convention, one way to sum to zero: use nothing
}
return sumRecursive(targetSum, power, 1, 0);
}
/**
* Recursively calculates the number of ways to express the remaining sum as a sum of Xth powers.
*
* @param remainingSum The remaining sum to achieve
* @param power The power to raise natural numbers to (X in the problem statement)
* @param currentNumber The current natural number being considered
* @param currentSum The current sum of powered numbers
* @return The number of valid combinations
*/
private int sumRecursive(int remainingSum, int power, int currentNumber, int currentSum) {
int newSum = currentSum + (int) Math.pow(currentNumber, power);
if (newSum == remainingSum) {
return 1;
}
if (newSum > remainingSum) {
return 0;
}
return sumRecursive(remainingSum, power, currentNumber + 1, newSum) + sumRecursive(remainingSum, power, currentNumber + 1, currentSum);
}
}