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; } }