[Luogu p1048] herbes et 01 école de sac à dos (re) notes d'apprentissage

portail

herbes

Titre description

Chen Chen est un enfant surdoué, son rêve est de devenir le plus grand médecin du monde. À cette fin, il a voulu adorer à proximité des plus prestigieux médecin en tant que professeur. Médecin afin de déterminer ses qualifications, lui a donné un problème. Les médecins l'a emmené dans une grotte pleine d'herbes lui dit :. « Les enfants, cette grotte a quelques herbes différentes, la cueillette chaque plante nécessite un certain temps, chaque plante a sa propre valeur et je donnerai vous un certain temps, pendant ce temps, vous pouvez choisir des herbes maximum si vous êtes un enfant intelligent, vous devriez être prises pour que la valeur totale des herbes ".

Si vous êtes chen, vous pouvez accomplir cette tâche?

Formats d'entrée et de sortie

Format d'entrée

Première ligne \ (2 \) entier \ (T \) (\ (. 1 \ Le T \ Le 1000 \) ) et \ (M \) (\ (. 1 \ Le M \ Le 100 \) ), avec séparés par un espace, \ (T \) représente le temps total qui peut être herbes utilisées, \ (M \) représente le nombre de plantes de cavernes.

La prochaine \ (M \) lignes comprennent chacun deux \ \ (1) à \ (100 \) entre (y compris \ (1 \) et \ (100 \) nombre entier), respectivement, une souche de récolte herbes temps et la valeur de cette souche d'herbes.

Format de sortie

La valeur totale maximale de sortie pendant la période de temps déterminée peut être prise aux herbes.

l'entrée et la sortie d'échantillon

# Exemple d'entrée 1

70 3
71 100
69 1
1 2

Sortie échantillon n ° 1

3

explication

  • Pour \ (30 \% \) données, \ (M \ 10 Le \) ;
  • Pour toutes les données, \ (M \ 100 Le \) .

NOIP2005 popularité du titre Groupe III

analyse

Bare 01sac à dos.
Mettre dp[i][j]à \ (j \) pour la première capacité en \ (i \) une valeur maximale d'un élément.

tous, nous ne pouvons pas voter d' abord pour l'article actuel. Cette fois, le résultat est dp[i - 1][j]. (Équivalent de ne pas mettre le premier \ (i \) deux éléments, à savoir, pas avant \ (i - 1 \) deux éléments \ (j \) La valeur maximale de la capacité de celui - ci)

Deuxièmement, vous pouvez également choisir l'élément en cours. Quel est le résultat de cette heure est - il? Ce sera certainement les premiers postes de dépenses électorales, mettre en place v[i]un espace dans le coût actuel des marchandises, w[i]est la valeur. Nous avons choisi cet article serait une perte v[i]de capacité, à ce moment , nous avons une j - v[i]plus grande capacité, ce qui signifie que nous aurons dp[j - v[i]]la base de la meilleure valeur. Ensuite, si elle est placée sur l'élément en cours, la valeur maximale actuelle devrait être ajouté w[i]. Sélectionnez ensuite les premiers ideux éléments, la valeur maximale est obtenue dp[j - v[i]] + w[i].

Ensuite , nous pouvons prendre le maximum dans les deux élections et les décisions non électorales: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]).

Ici pour vous évader? Non, il y a une fosse. Si la capacité restante en cours correspondent tout simplement les premiers ideux éléments, il est également engagé dans ce qui ne peut pas voter. Nous avons donc besoin aussi de déterminer la capacité restante ne peut pas contenir des articles.

Ceci est une équation de transfert à deux dimensions.

Observé dp[i]et dp[i - 1]chaque transition d'état avec seulement deux couches d'une relation. Ensuite , nous orientons un tableau de roulement Jiuhaola.

Tout d' abord, l' dp[i][j]optimisation dp[j], et d' examiner ensuite dp[i - 1]comment engager.

En fait, je ne veux pas rien à dire, bien correctement dp[j]. La clé est de considérer le cas de l'élection: dp[i - 1][j - v[i]].
Dans l'équation d' origine, c'est la i - 1valeur de la couche, qui cherchent du dp[j]temps, dp[j - v[i]]ne peut pas être mis à jour pour la première icouche, il doit rester dans la première i - 1couche. Mais le j - v[i]rapport jsera certainement plus petite ( v[i]est un entier positif), donc si nous sommes pré - commande traversal, traversé dp[j]quand, au dp[j - v[i]]début de la mise à jour de il'état de la couche. Cela ne peut pas, donc nous devons faire jtraversal inverse .

Talk est pas cher, vous montrer mon code:

code

/*
 * @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;
}

résultats de l'évaluation

AC 100: R31680239 ( D' accord, je l' avoue je herbes folles répliquent les modifications à retourner ......)

Je suppose que tu aimes

Origine www.cnblogs.com/crab-in-the-northeast/p/luogu-p1048.html
conseillé
Classement