[Luogu p1616] ervas e escola mochila completamente louco (re) Notas de aprendizagem

portal

ervas loucos

fundo tópico

Esta edição, intitulado Louco NOIP2005 terceira questão da popularidade do grupo. Este LiYuxiang comemorativa intitulada nascido.

título Descrição

LiYuxiang era 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 em todos os lugares ervas disse-lhe:

"Meu filho, esta caverna tem alguns tipos diferentes de ervas, cada um dos quais mineração vai levar algum tempo, cada qual tem o seu próprio valor. Vou dar-lhe algum tempo, durante este tempo, você pode pegar algumas ervas Se você é um garoto inteligente, você deve ser capaz de fazer o valor total de ervas tomadas ao máximo. "

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

Este problema é diferente e título original:

  1. Cada colheita louco erva ilimitado.
  2. O tipo de drogas deslumbrante, ervas para um bom tempo ah! Assim também são o crisântemo mestre grato!

formatos de entrada e saída

Formato de entrada

De entrada da primeira linha tem dois inteiros T (1 <= t <= 100000) e M (1 <= M <= 10000), separadas por um espaço, e T representa um tempo total pode ser usado ervas, M para caverna o número de anos de medicina herbal. Próximo M linhas cada uma compreendendo dois números inteiros entre 1 e 10000 (incluindo 1 e 10000) representam, respectivamente, o valor de um determinado período de tempo da colheita de erva e a erva.

Formato de saída

linha de saída, que contém um único número inteiro que representa dentro do período de tempo prescrito, podem ser adoptadas para um valor máximo total de ervas.

de entrada de amostra e de saída

Entrada # 1

70 3
71 100
69 1
1 2

Saída # 1

140

Descrição / Dicas

Dados para 30%, M <= 1000;

Para todos os dados, H <= 10000, e M * t <10000000 (não contados, 0 7).

Venha LiYuxiang, a primeira AC deixá-lo!

análise

Este problema é uma mochila completamente nua.
E 01diferença mochila é que uma coisa pode acessar completamente mochila ilimitado. Então suponho que se reuniram \ (n \) sobre as ervas, então a equação de transição de estado, neste caso, deve ser dp[i][j] = dp[i - 1][j - n * v[i]] + n * w[i].
Se tomarmos a equação de transição estado inteiro, define um \ (\ max \) em que:
dp[i][j] = max(dp[i][j],dp[i - 1][j - n * v[i]] + n * w[i]).
Mas se assim for, a complexidade de tempo é \ (O (MT ^ T) \) , o escopo do problema é que os dados \ (M \ Le 10000 \) , \ (T \ Le 100000 \) , assim você pode usar este método T voar.

Como fazer isso?

Basta colocar 01a mochila que circula no interior jda ordem inversa pode ser alterado. Se você não sabe 01unidimensional mochila otimização é por ordem inversa, ver que eu escrevi esta solução do problema .

Então, como pode isso com 01algo a ver com isso mochila? Primeira 01mochila dependente sub-resultado dp[i - 1][j - v[i]], porque 01a mochila é selecionado e não selecionado apenas dois tipos, então a equação de transição estado selecionado da corrente não contém iitens. Em outras palavras, ele encolheu para unidimensional tempo para garantir dp[j - v[i]]percurso inverso, de modo a garantir passagem de dp[j]tempo dp[j - v[i]]ou no chão do estado (estado não atualizado).

Mas não é exatamente o mesmo como uma mochila, escolher quantas escolher o quanto o amor, para que considere adicionar uma segunda opção itipos de estratégia de produtos, você precisa considerar dp[i][j - v[i]]este sub-resultados. Em outras palavras, a versão bidimensional da mochila, a equação de transição de estado para dp[i - 1][j - v[i]]se tornar o dp[i][j - v[i]]. O encolheu para unidimensional, atravessado dp[j]quando necessário para dp[j - v[i]]ser atualizado. Isso requer amigos seqüência de passagem positivos ~

Essa é uma mudança positiva na ordem inversa. Mágica, certo? Este é o dpcharme.

código

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2020-03-12 20:54:13 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2020-03-13 01:28:22
 */
#include <iostream>
#include <cstdio>

const int maxm = 10005;
const int maxt = 100005;

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 = v[i]; j <= T; 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

RE 44: R31673389 (motivo: errado faixa de tamanho de matriz de dados ...... confuso ......)
AC 100: R31673423 (Este código embora AC, mas um pequeno problema em termos de tamanho da matriz)
AC 100: R31680243

Acho que você gosta

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