divisão inteira algoritmo recursivo, e toda a saída dividido (Java)
publicidade Hit , todos os algoritmos de trabalhar eu vou atualizar o código no meu GitHub
deslizamento Conhecimento Fábrica --Homework-AlgorithmAnalysis
Espero que possamos jogar um pouco ⭐⭐ , obrigado
Algoritmo ainda está trabalhando, este é um problema inteiro dividir.
A Internet por um longo tempo, a maioria está buscando divisão inteira do número de espécies, raramente buscando situação análise detalhada.
Há também a versão da linguagem C, e não pode encontrar um Java.
Então eu vim com um Java (quase o mesmo, mas se alguém precisa versão Java do fácil de pesquisar)
problema
Explicar o problema, qual é a divisão inteira?
n = m1 + m2 + ... + mi; (em que mi é um número inteiro positivo e 1 <= mi <= N), em seguida o {M1, M2, ..., mi} é uma divisão de n.
Se {m1, m2, ..., mi} não é mais do que o valor máximo m, ou seja, max (m1, m2, ..., mi) <= m, diz-se pertencer a um m n dividida. Aqui, indica o número n é dividido por m f (n, m);
Por exemplo, quando N = 6, podemos obter que vários dos seguintes divisão:
6 = 6
6 5 + 1 =
6 2 = 4 +
6 + 4 = 1 + 1
6 3 + 3 =
6 + 2 + 1 = 3
3 1 + 6 = 1 + 1 +
6 2 + 2 + 2 =
6 = 2 + 2 + 1 + 1
6 + 1 = 2 1 + 1 + 1 +
6 = 1 + 1 + 1 + 1 + 1 + 1
análise
Deste modo, é muito fácil de ver, n para uma divisão é baseada em N-1 com base em, de modo que não pode ser representado pela fórmula de recorrência.
É difícil encontrar um único parâmetro recursivo, então adicionamos um parâmetro m, resultado divisão representa o maior adendo.
A relação entre n e m, considerar os seguintes casos:
-
Quando n = 1, independentemente do valor do número m (m> 0), isto é, apenas um particionamento {1};
-
Quando m = 1, n tem um valor, independentemente do número, n, de apenas uma divisão 1, {1,1,1, ..., 1};
-
Quando n = m, divididos de acordo com se a incluir n, que pode ser dividido em duas situações:
(A) uma caixa que contém n divisão, isto é, apenas uma {n};
(B) n não inclui a divisão, o maior número de divisão de tempo certamente menor do que n, isto é, toda a divisão n (n-1). Portanto q (n, n) = 1 + q (N, N-1);
-
Quando n <m, uma vez que a divisão negativo impossível, portanto, equivalente a q (n, n);
-
No entanto, n> m, o valor máximo de acordo com divisão contém m, pode ser dividida em duas situações:
(A) contida no caso de divisão de m, isto é, nm {m, {x1, x2, ... xi}}, onde {x1, x2, ... xi} e é, portanto, neste caso, é q (nm, m)
O caso (b) não contém divisão de m, a divisão de todos os valores menores do que m, isto é, o N (m-1) é dividido, o número de q (N, M-1);
Portanto q (n, m) = q (nm, m) + q (N, M-1);
código
Procura espécies divisão inteira
/*
* @Title division
* @Description 整数划分方法
* @author 滑技工厂
* @Date 2020/3/8
* @param [n, m] n->要划分的整数 m->最大加数
* @return int 输出有多少种划分
* @throws
*/
public static int division(int n, int m) {
if (n < 1 || m < 1)
return 0;
if (n == 1 || m == 1)
return 1;
//最大加数如果大于n 则另最大加数为n
if (n < m)
return division(n, n);
//m=n,则从
if (n == m)
return division(n, m - 1) + 1;
return division(n, m - 1) + division(n - m, m);
}
Buscando divisão específica de
static int mark[] = new int[100];//记录分解情况
static int n;
/*
* @Title divide
* @Description 输出划分
* @author 滑技工厂
* @Date 2020/3/8
* @param [now, k, pre]
* @return void
* @throws
*/
public static void divide(int now, int k, int pre) {
int i;
//数组长度大于n就返回
if (now > n) return;
if (now == n) {
System.out.printf("%d=", n);
for (i = 0; i < k - 1; i++) {
System.out.printf("%d+", mark[i]);
}
System.out.printf("%d\n", mark[i]);
} else {
for (i = pre; i > 0; i--) {
if (i <= pre) {
mark[k] = i;
now += i;
divide(now, k + 1, i);
now -= i;
}
}
}
}
Resultados 6 como um exemplo, é obtido
End Sahua ✿, presentes de rosas.