mármore divisão CH5E07 (dp + mochila de divisão binária)

    portal

    Para o efeito:

  São em mármore valioso 1..6 cada um [1..6] bloco, eles agora querem dividida em duas partes, de modo que o valor igual à soma de duas partes, pode ser perguntado se implementado. O número total de mármore que não excede 20.000.

 ideias de resolução de problemas:

  Multiple corretamente corretamente mochila + divisão binária, dividir escrever principalmente sobre binário salvar um arquivo (pesadelo de uma criança).

  Como sabemos, 2 0 , 2 . 1 , 2, 2 , 2 ...... K. 1- escolher o número obtido por adição de 2 ~ 0 K qualquer número de -1. Em seguida, um número de divisão binária s, o primeiro passo é para encontrar o máximo k satisfaz 2 k -1 <= S , grupo C = 2 s- k com +1. Evidente para 2 0 , 2 . 1 , ......, 2 K-. 1 , uma pluralidade de C pode escolher o número obtido pela adição de um número arbitrário de 0 ~ s. Este problema de otimização é fazer nessa idéia, pegue o valor de 1, por exemplo mármore, tem um valor de t1 mármore 1, t1 pode ser dividida em 2 0 , 2 1 , 2 2 , ......, 2 k -1 , C, e podem ser múltiplas para resolver a mochila para a mochila 01, cada número s pode dissolver o registo (s), o total de complexidade o (nlogn)

  

#include <bits / STDC ++ h.>
 usando  namespace std;
int Num [ 7 ] [ 10086 ];
boleano bk [ 100086 ];
int main ()
{
    int t [ 10 ];
    enquanto ( 1 ) {
         int soma = 0 ;
        para ( int i = 1 ; i <= 6 ; i ++ ) {
            scanf ( " % d " , & t [i]);
            soma + = t [i] * i;
        }
        se (soma == 0 )     quebrar ;
        se (soma & 1 ) {
            cout << " Não é possível " << endl; continuar ;
        }
        soma / = 2 ; para ( int i = 1 ; i <= soma; i ++) bk [i] = falsa ; bk [ 0 ] = verdadeira ;
        para ( int i = 1 ; i <= 6 ; i ++ ) {
             int t1 = 0 , t2 = 0 ;
            enquanto (t [i]> = ( 1 << t1)) {
                Num [i] [t1] = ( 1 << t1); t1 ++ ;
            }
            Se (t [i] - ( 1 << t1)) Num [i] [t1 ++] = t [i] - ( 1 << t1);
            para ( int j = 0 ; <; j t1 j ++ ) {
                 para ( int ; = i * Num [i] [j]; h-- h h = soma> ) {
                    bk [h] | = bk [oi * Num [i] [J]];
                }
            }
        }
        se (bk [soma]) cout << " Can " << endl;
        else         cout << " Não é possível " << endl;
    }
}
View Code

 

Acho que você gosta

Origin www.cnblogs.com/r138155/p/12663900.html
Recomendado
Clasificación