2755: A Magia do bolso (recursivo, programação dinâmica)

 

prazo total: 
10000ms
 
Limite de memória: 
65536kB
descrição
Há um bolso magia, o volume total foi de 40, com algumas variações deste artigo bolsos, o volume total desses itens deve ser de 40. John agora existem n itens a serem obtidos, um volume de cada item são A . 1 , A 2 ...... Um n . John podem ser seleccionados a partir de alguns desses itens, se o volume total do objeto 40 é selecionado, em seguida, usar o bolso mágico, John esses itens podem ser obtidos. A questão agora é, John Quantas maneiras diferentes de selecionar itens.
entrada
A primeira linha de entrada é um número inteiro positivo n (1 <= n <= 20), indica o número de itens diferentes. As próximas n linhas, cada linha tem um número inteiro positivo entre 1 e 40, é dado um . 1 A, 2 ...... Um n valores.
exportação
O número de itens diferentes de modo de seleção de saída.
entrada de amostra
3 
20 
20 
20
Exemplo de saída
3
1  // Método a: o número de itens recursivos e volume de produto n matriz de um [100] para variáveis globais;
 2  // COUNT (i, SUM) representa o número de combinações a partir do início da i-ésima matriz de volta para estatísticas e soma do número de tipos,
 3.  // soma e combinação número é: COUT (I, soma) = COUT (. I + 1, soma-a [i]) + COUT (. I + 1, soma),
 . 4  // em que cout (i + 1, sum- a [i]) representa contém um [i], isto é, a partir do primeiro i + 1 seguinte número de contagem de
 5  // número e combinação de soma-a [i] é o número do tipo, e cout (i + 1, soma) indica não compreendem uma [i], isto é, a partir do número de i + 1 em diante combinação estatística de números e o número de tipos de ******** soma *************************** 
. 6 #include <o iostream>
 7.  a utilização  de espaço de nomes DST;
 8.  
9.  int Um [ 100 ];
 10  int n- = . 1 ;
 . 11  int COUNT (int I, int soma) {
 12 é      SE (soma == 0 ) {
 13 é          retorno  1. ;    // encontrar um conjunto de combinação soma e número; 
14      }
 15      SE (I == n-soma || < 0 ) retornar  0 ; // I == nenhum outro n- número de instruções são combinados, soma <0 indicam que uma combinação não; 
16      retorno COUNT (I + . 1 , um-sUM [I]) + COUNT (I + 1. , sUM); // a partir da matriz i é iniciado pela primeira vez, que compreende a [i], e não inclui; 
. 17  }
 18 é  
19.  int main () {
 20 é      o tempo (CIN >> n-) {
 21 é         para ( int i = 0 ; i <n; i ++ )
 22              cin >> a [i];
23          cout << count ( 0 , 40 ) << endl;
24      }
 25      retorno  0 ;
26 }
1  // Método dois: dinâmica de programação 
2 #include <o iostream>
 . 3  o uso  de espaço de nomes DST;
 . 4  #define N 100
 . 5  int n-, A [N];
 . 6  int main () {
 7.      O tempo (CIN >> n-) {
 8.          Int (DP *) [ 50 ] = novo novo  int [N] [ 50 ]; // DP [i] [J] indica que o i-ésimo item no volume de frente Couchu J; 
. 9          para ( int i = 1. ; i <= N-; ++ I ) {
 10              CIN >> A [I];
 . 11              DP [I] [0 ] = 1 ; // 初始边界
12          }
 13          dp [ 0 ] [ 0 ] = 1 ;
14          para ( int i = 1 ; i <= n; i ++ )
 15              para ( int j = 1 ; j <= 40 ; j ++ ) {
 16                  dp [i] [j] = dp [i- 1 ] [j];
17                  , se (a [i] <= J)
 18                      dp [i] [j] = + dp [i- 1 ] [J- a [i]];
19              }
20          cout << dp [n] [ 40 ] << endl;
21          de exclusão [] dp;
22      }
 23      retorno  0 ;
24 }

 

Acho que você gosta

Origin www.cnblogs.com/aiqinger/p/12599557.html
Recomendado
Clasificación