[P1048 Luogu] ervas e escola 01 mochila (re) notas de aprendizagem

portal

ervas

título Descrição

Chen Chen é uma criança superdotada, seu sonho é tornar-se maior médico do mundo. Para este fim, ele queria adorar nas imediações do médico mais prestigiada como professor. Médico, a fim de determinar as suas qualificações, deu-lhe um problema. Médicos levou para uma caverna cheia de ervas lhe diz :. "As crianças, esta caverna tem algumas ervas diferentes, escolhendo cada planta requer algum tempo, cada planta tem seu próprio valor e vou dar -lhe algum tempo, durante este tempo, você pode escolher algumas ervas máximo se você é um garoto inteligente, você deve ser tomado para fazer o valor total de ervas. "

Se você é chen, você pode realizar essa tarefa?

formatos de entrada e saída

Formato de entrada

Primeira linha \ (2 \) inteiro \ (T \) (\ (. 1 \ Le T \ Le 1000 \) ) e \ (M \) (\ (. 1 \ Le H \ 100 Le \) ), com separadas por um espaço, \ (T \) representa o tempo total que podem ser usados ervas, \ (M \) representa o número de cavernas ervas.

O seguinte \ (M \) linhas cada inclui duas \ 1 (\) para \ (100 \) entre (incluindo \ (1 \) e \ (100 \) número inteiro), respectivamente, uma estirpe de colheita ervas tempo e o valor desta estirpe de ervas.

Formato de saída

O valor máximo total de saída dentro do período de tempo especificado pode ser levado para as ervas.

de entrada de amostra e de saída

Entrada de Amostra # 1

70 3
71 100
69 1
1 2

Exemplo de saída # 1

3

explicação

  • Para \ (30 \% \) de dados, \ (M \ 10 Le \) ;
  • Para todos os dados, \ (M \ 100 Le \) .

popularidade NOIP2005 do título do Grupo III

análise

Nua 01mochila.
Definido dp[i][j]como a \ (j \) para a ex capacidade em \ (i \) um valor máximo de um item.

Primeiro de tudo, não podemos votar a favor do presente artigo. Desta vez, o resultado é dp[i - 1][j]. (Equivalente a não colocar a primeira \ (i \) dois itens, ou seja, não antes de \ (i - 1 \) dois itens \ (j \) O valor máximo da capacidade dele)

Em segundo lugar, você também pode escolher o item atual. Qual é o resultado desta vez é? Isso certamente serão os primeiros itens de despesa eleição, criar v[i]um espaço no custo atual de bens, w[i]é o valor. Nós escolhemos este artigo seria um desperdício v[i]de capacidade, neste momento temos j - v[i]mais capacidade, o que significa que teremos dp[j - v[i]]a base do melhor valor. Então, se colocado no item atual, deve ser adicionado o valor máximo atual w[i]. Em seguida, selecione os primeiros idois itens, o valor máximo é obtido dp[j - v[i]] + w[i].

Então, podemos tirar o máximo em ambas as decisões eleitorais e não-eleitorais: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]).

Aqui para ficar longe? Não, não há um poço. Se a capacidade restante atual simplesmente encaixar os primeiros idois itens, também está envolvida no que só não pode votar. Então, nós também precisa determinar a capacidade restante não pode conter itens.

Esta é uma equação de transferência bidimensional.

Observado dp[i]e dp[i - 1]cada transição de estado com apenas duas camadas de uma relação. Em seguida, dirigir uma matriz de rolamento Jiuhaola.

Primeiro, dp[i][j]otimização dp[j], e então considerar dp[i - 1]como se envolver.

Na verdade, eu não escolher nada a dizer, corretamente corretamente dp[j]. A chave é a de considerar o caso da eleição: dp[i - 1][j - v[i]].
Na equação original, este é o i - 1valor da camada, que procuram dp[j]tempo, dp[j - v[i]]não pode ser atualizado para a primeira icamada, ele deve permanecer na primeira i - 1camada. Mas a j - v[i]proporção jserá certamente menor ( v[i]é um inteiro positivo), então se nós estamos pré-venda de passagem, atravessado dp[j]quando, dp[j - v[i]]no início da atualização para io estado da camada. Este não pode, por isso temos de fazer jtravessia inversa .

Falar é fácil, mostrar-lhe o meu código:

código

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2020-03-12 01:24:35 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2020-03-13 01:27:42
 */
#include <iostream>
#include <cstdio>

const int maxm = 105;
const int maxt = 1005;

inline int max(int a,int b) {
    return a > b ? a : b;
}

int v[maxm],w[maxm],dp[maxt];

int main() {
    int T,M;
    std :: cin >> T >> M;
    for(int i = 1; i <= M; i++) 
        std :: cin >> v[i] >> w[i];
    
    for(int i = 1; i <= M; i++)
        for(int j = T; j >= v[i]; j--)
            dp[j] = max(dp[j],dp[j - v[i]] + w[i]);
        
    std :: cout << dp[T] << std :: endl;
    return 0;
}

Os resultados da avaliação

AC 100: R31680239 (Ok, eu admito que eu estava ervas loucos replicar as alterações para virar ......)

Acho que você gosta

Origin www.cnblogs.com/crab-in-the-northeast/p/luogu-p1048.html
Recomendado
Clasificación