Quiero calcular el número de diferentes grupos ordenados de n números enteros de modo que los elementos de cada grupo resume a Anúmero de diferentes grupos de N enteros que resumen a A
Por ejemplo: si N = 3 y A = 3 el resultado debería ser 10:
1 = [3, 0, 0]
2 = [2, 1, 0]
3 = [1, 2, 0]
4 = [ 0, 3, 0]
5 = [2, 0, 1]
6 = [1, 1, 1]
7 = [0, 2, 1]
8 = [1, 0, 2]
9 = [0, 1, 2]
10 = [0, 0, 3]
la forma I lo hizo fue por fuerza bruta:
public static int calc(int a, int n){
if (n <= 1 || a == 0) return 1;
int sum = 0;
for (int i=0; i<=n; i++)
sum += calc(a - i, n - 1);
return sum;
}
sospecho que no puede haber una mejor manera (algunos cálculos matemáticos que falta ..) está ahí?
EDITAR En la pregunta original me olvidó tomar en consideración el orden
También llamado [Programación dinámica] (https://en.wikipedia.org/wiki/Dynamic_programming). – starblue
@starblue Memoization es una de varias técnicas de programación dinámica; llamarlo "programación dinámica" sería menos específico. – dasblinkenlight