divisão inteira algoritmo recursivo, e toda a saída dividido (Java)

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:

  1. Quando n = 1, independentemente do valor do número m (m> 0), isto é, apenas um particionamento {1};

  2. Quando m = 1, n tem um valor, independentemente do número, n, de apenas uma divisão 1, {1,1,1, ..., 1};

  3. 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);

  4. Quando n <m, uma vez que a divisão negativo impossível, portanto, equivalente a q (n, n);

  5. 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);
Aqui Insert Picture Descrição

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
Aqui Insert Picture Descrição

End Sahua ✿, presentes de rosas.

Aqui Insert Picture Descrição

Publicado 41 artigos originais · ganhou elogios 94 · vista 9557

Acho que você gosta

Origin blog.csdn.net/qq_41718454/article/details/104733740
Recomendado
Clasificación