Analyse d'algorithmes et expérience de conception: 01 sac à dos

Description du problème:

Il y a N articles et un sac à dos d'une capacité de V. Le poids du i-ème élément est le poids [i] et la valeur est la valeur [i]. La résolution des articles emballés dans le sac à dos peut faire en sorte que le poids total de ces articles ne dépasse pas la capacité du sac à dos et la valeur maximale. Notez que contrairement au problème du sac à dos, chaque élément n'a que deux options: chargement complet et aucun chargement, et chaque élément ne peut être chargé qu'une seule fois.

Description de l'algorithme:

Utilisez f (i, v) pour indiquer la valeur maximale qui peut être obtenue lorsque les premiers i éléments sont chargés sélectivement dans un sac à dos avec une capacité restante de v. Ici, nous séparons le i-ème élément du précédent i-1. Le i-ème élément ne peut être chargé ou non.

1. S'il n'est pas installé, la capacité restante ne diminuera pas et la valeur ne changera pas, donc dans ce cas f (i, v) = f (i-1, v)

2. S'il est installé, la capacité diminue et la valeur augmente, donc dans ce cas f (i, v) = f (i-1, vw eigh t [i]) + value [i]

D'un point de vue descendant, si le i-ème article est chargé, la valeur maximale des premiers i-1 articles avec la capacité restante réduite doit être résolue au niveau suivant. La valeur maximale d'un article avec la capacité restante inchangée.

Par conséquent, pour le chargement et le déchargement du i-ème article, il suffit de prendre le maximum des deux. Vous pouvez donc obtenir l'équation de transition d'état:

f (i, v) = f (i-1, v)                                           (v <poids [i], c'est-à-dire que la capacité restante n'est pas suffisante pour mettre des articles)

f (i, v) = f (i-1, vw eigh t [i]) + valeur [i]                (v> = poids [i], c'est-à-dire que la capacité restante est suffisante)

Étant donné que chaque ligne de données dépend uniquement de la ligne précédente, elle peut être optimisée à l'aide d'un tableau roulant

Code:

 

#include <iostream> 
#include <vector> 
#include <algorithm>
 using  namespace std;
// f [i] [v] = max {f [i-1] [v], f [i-1] [vw [i]] + val [i]}
 // f [v] = max (f [poids v [i]] + valeur [i], f [v]) 
int résoudre ( int n, capacité int , vecteur < int > & poids, vecteur < int > & valeur) 
{ 
    if (n < 0 || capacité <= 0 )
         renvoie  0 ; 
    vecteur < int > f (capacité + 1 );
    pour (int i = 0 ; i <n; i ++ ) 
    { 
        for ( int v = capacité; v> 0 ; v-- ) 
        { 
            if (v> = poids [i]) f [v] = max (f [v-poids [i]] + valeur [i], f [v]); 
        } 
    } 
    return f [capacité]; 
} 

int main () 
{ 
    int n, capacité; 
    cin >> n >> capacité; 
    vecteur < int > poids (n); 
    vecteur < int > valeur (n);
    pour ( int i = 0; i <n; i ++ ) 
    { 
        cin >> weight [i] >> value [i]; 
    } 

    int ans = résoudre (n, capacité, poids, valeur); 
    cout << ans << endl;
    retourner  0 ; 
}

 

Je suppose que tu aimes

Origine www.cnblogs.com/misaka-cn-cs/p/12743480.html
conseillé
Classement