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 01
mochila.
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 i
dois 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 i
dois 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 - 1
valor da camada, que procuram dp[j]
tempo, dp[j - v[i]]
não pode ser atualizado para a primeira i
camada, ele deve permanecer na primeira i - 1
camada. Mas a j - v[i]
proporção j
será 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 i
o estado da camada. Este não pode, por isso temos de fazer j
travessia 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 ......)