Vous gérez une scierie qui coupe des planches. Pour simplifier, on supposera que toutes les
planches font la même largeur: seule leur longueur diffère.
Votre unique client, une grande enseigne de distribution, vous a donné une liste de modèles:
chaque modèle à une longueur précise, et vous sera payé un prix donné. La demande est supposée infinie,
pour tous les modèles.
À chaque fois qu'un tronc d'arbre arrive, il sera automatiquement découpé en planches très longues d'une
longueur L.
Votre travail est de déterminer comment couper cette planche de longueur L en planches vendables,
pour maximiser le prix total de vente.
Implémentez dans un fichier cut.cc la fonction OptimalCut() décrite dans le fichier cut.h:
#ifndef __CUT_H
#define __CUT_H
#include <vector>
using namespace std;
// Description d'un modèle de planche vendable: longueur et prix.
struct PricedCut {
int length; // Sera toujours >= 1.
double price; // Sera toujours > 0.
};
// Détermine la manière optimale de découper une planche de longueur L
// en planches vendables (pour maximiser le prix de vente total).
// Renvoie le prix de vente maximal.
// Écrit la liste des modèles choisis (un même modèle peut être répété
// plusieurs fois), dans un ordre quelquonque, dans le vecteur "cut_indices"
// (on écrira simplément l'indice des modèles).
//
// IMPORTANT: Le test de cette fonction est en 2 parties: d'abord, il teste
// simplement la valeur de renvoi, ensuite il teste "cut_indices". Si vous
// ne remplissez pas ce dernier, vous pourrez quand meme avoir des points.
//
// ATTENTION: les gains sont des nombres réels (double), pas des entiers.
//
// EXEMPLE:
// OptimalCut(257, {{40, 3.8}, {70, 6.7}, {90, 9.0}}) = 6.7 + 9.0 + 9.0
// avec cut_indices = [1,2,2].
double OptimalCut(int L, const vector<PricedCut>& cuts,
vector<int>* cut_indices)
#endif // __CUT_H
Test: make cut
RENDU: cut.cc