Bénéfice maxi

Résolu/Fermé
Utilisateur anonyme - 1 mars 2013 à 22:45
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 - 3 mars 2013 à 16:15
Bonjour,

Je réalise un programme qui me calcul le bénéfice maximal et qui me retourne le nombre de lot de papier Peint et nombre de peintu de Peinture. Le programme me donne 20 lots de chaque et 1700 € de bénéfice. Sauf quand je fé le calcul à la mains, le nombre d'heures de travail est dépassé. Pouvez vous m'aidez à voir ce qui va pas

import static java.lang.Math.*;

import java.util.Scanner;
public class bénéficeMaxi{

public static void main(String[] args) {

int nbPapierPeint = 0;
int nbPeinture = 0;
int beneficeMaximal = 0;

int nbHeureTravail = 0;
int argentInvestie = 0;

while (nbHeureTravail < 390 && argentInvestie < 12000)
{
nbPapierPeint = nbPapierPeint + 1;
nbPeinture = nbPeinture + 1;

nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;

beneficeMaximal = (nbPapierPeint * 45) + (nbPeinture * 40);
}
System.out.println("Le nombre de lots de rouleaux de papier peint est de " + nbPapierPeint);
System.out.println("Le nombre de lots de pots de peinture est de " + nbPeinture);
System.out.println("Le bénéfice maximal est de " + beneficeMaximal);
}
}


13 réponses

walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
2 mars 2013 à 05:15
bonjour,
je pense si bien compris ta demande, c'est que tu attend un nombre d'heure de travail < 390.

si tu fait le calcul, avec nbPapierPeint et nbPeinture =20, tu trouvera nbHeureTravail =400 > 390 et argentInvestie = 11200 < 12000; alors, la condition pour sortir de la boucle while était avec celle de nbHeureTravail.

si non, je pense que je n'ai pas bien compris ta question.
1
Utilisateur anonyme
2 mars 2013 à 11:07
c'est sa, il faut que les deux soit inférieur, le nombre d'heure de travail doit être inférieur ou égale à 390 et l'argent investi inférieur ou égal à 12 000
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
2 mars 2013 à 18:07
bonjour,

alors tt simplement, il faut prendre la valeur final moins un, c a dire, avant la fin du programme:
//Recalcul des données avec l'avant derniere valeur des varibales
nbPapierPeint =nbPapierPeint -1;
nbPeinture = nbPeinture -1;
//Calcul des données:
nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;
//Affichage
systeme.out.pri...(...)

bonne chance
0
Utilisateur anonyme
2 mars 2013 à 19:13
je doit pas enlever le while?
car si je fait comme tu a dit, mettre - 1, g des valeurs négatives
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
2 mars 2013 à 19:28
non!!!!
je voulais dire, apré le while, il faut décrémenter les valeurs finales de tes 2 variables nbPapierPeint et nbPeinture et puis recalculer les autres données pour avoir enfin tes conditions nbHeureTravail < 390 et argentInvestie < 12000 bien remplies.

rend moi compte si je ne suis pas clair.
0
Utilisateur anonyme
2 mars 2013 à 20:03
J'ai fais sa mais sa marche pas:

while (nbHeureTravail < 390 && argentInvestie < 12000)
{
nbPapierPeint = nbPapierPeint - 1;
nbPeinture = nbPeinture - 1;


nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;

beneficeMaximal = (nbPapierPeint * 45) + (nbPeinture * 40);
}
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 2/03/2013 à 20:12
bonsoir,

voila la partie du code qui t'intéresse:

while (nbHeureTravail < 390 && argentInvestie < 12000)
{
nbPapierPeint = nbPapierPeint + 1;
nbPeinture = nbPeinture + 1;

nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;

beneficeMaximal = (nbPapierPeint * 45) + (nbPeinture * 40);
}

//Décrémenter les valeurs finales (c a dire, au lieu de 20, on va utiliser 19)
nbPapierPeint = nbPapierPeint - 1;
nbPeinture = nbPeinture - 1;

//Recalcul des données à afficher
nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;
beneficeMaximal = (nbPapierPeint * 45) + (nbPeinture * 40);

//Affichage des données

System.out.println("Le nombre de lots de rouleaux de papier peint est de " + nbPapierPeint);
System.out.println("Le nombre de lots de pots de peinture est de " + nbPeinture);
System.out.println("Le bénéfice maximal est de " + beneficeMaximal);
}

ça répond à ta demande?
0
Utilisateur anonyme
2 mars 2013 à 20:23
sa m'affiche 19 de chaque
alors qu'on devrai avoir 19 papier peint et 20 peinture: 19 * 12 = 228 et 20 * 8 = 160 + 228 = 388
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
2 mars 2013 à 20:33
ahh ok,

pr moi, je ne comprenais pas exactement les données, mais puisque tu veux une qu'il soit 19 et l'autre 20, alors il faut séparer les conditions dans while.

autrement, il faut deux boucles while, chaqu'une pour une variable.

est ce c'est ça?
0
Utilisateur anonyme
2 mars 2013 à 20:35
Je pense
l'énoncé c'est que je doit trouver le nombre de rouleau de papier peint et le nombre de post de peinture sachant que cela ne doit pas dépaser le nombre d'heure de travail (390) et le capital (12 000)
0
Utilisateur anonyme
2 mars 2013 à 20:36
19 et 20 c'est ce que je trouve en faisant les calculs
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
2 mars 2013 à 23:27
ahhh d'accord, alors il faut définir deux boucles while indépendantes, puisque tes variables le sont aussi.
0
Utilisateur anonyme
2 mars 2013 à 23:32
une pour temps travail et l'heure pour argent investie?
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 3/03/2013 à 01:05
Bonsoir,

pardonné moi, mais je viens juste de comprendre ce que tu veux faire.
enfaite, c de la programmation linéaire avec deux variables.
donne moi un peu de temps pour y réfléchir, et je vais vous répondre (logique + code java)
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 3/03/2013 à 04:42
bonsoir/bonjour

quel surprise, le bénéfice maximal ne correspond pas au couple (19,20), mais plutôt (15,26).

ça m'a surpris, et j'ai cru pour un moment que le programme est erroné... mais j'ai vérifié manuellement (15,26) donne un bénéfice supérieur à celui du (19,20).

voila le code java (j'ai y met des commentaires pour expliqué la méthode utilisée pour trouver le bénéfice maximal et ses variables correspondantes)


public class Test {
public static void main(String[] args) {

int nbPapierPeint = 0, nbPeinture = 0;
int nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
int argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;
int beneficeMaximal = (nbPapierPeint * 45) + (nbPeinture * 40);

// Variables de sauvegarde
int valeurNbPapierPeint=0;
int valeurNbPeinture=0;
int [] TabBeneficeMaximal= new int[33];

for (nbPapierPeint=0;nbPapierPeint<33;nbPapierPeint++)
{
/*********************************************************
* On fixe une variable (dans ce cas c'est nbPapierPeint)*
* et on cherche le bénéfice maximum en variant l'autre *
* varible (nbPeinture) *
*********************************************************/
for(nbPeinture=0;nbPeinture<39;nbPeinture++)
{
/*********************************************************
* A cette étape nous disposons de deux valeurs de nos *
* variables nbPapierPeint et nbPeinture, alors il suffit*
* de calculer les autres données et de vérifier s'ils *
* remplissent les conditions de mérite *
*********************************************************/
nbHeureTravail = nbPapierPeint * 12 + nbPeinture * 8;
argentInvestie = nbPapierPeint * 250 + nbPeinture * 310;
TabBeneficeMaximal[nbPapierPeint]= nbPapierPeint * 45 + nbPeinture * 40;

if (nbHeureTravail<390 && argentInvestie<12000
&& beneficeMaximal<TabBeneficeMaximal[nbPapierPeint])
{
/*********************************************************
* Si les nouvelles valeurs remplissent les conditions de*
* mérite, on les enregistre pour pouvoir les afficher *
*********************************************************/
beneficeMaximal= TabBeneficeMaximal[nbPapierPeint];
valeurNbPeinture=nbPeinture;
valeurNbPapierPeint=nbPapierPeint;
}
}
}
// Affichage du bénéfice maximal et et ses variables correspondantes
//******************************************************************
System.out.println("Bénéfice maximal vaut "+beneficeMaximal
+" correspendant au couple (nbPapierPeint= "+valeurDeI
+", nbPeinture= "+valeurDeJ+")");
}
}

et voila le résultat affiché:

Bénéfice maximal vaut 1715 correspendant au couple (nbPapierPeint= 15, nbPeinture= 26)

Bonne chance
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
3 mars 2013 à 04:44
NB: tu n'a pas besoin d'importer les bibliothèques Maths...
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
3 mars 2013 à 04:51
les valeurs 33 et 39 sont calculées en supposant une variable vaut 0 et en y appliquant les inégalités nbHeureTravail et argentInvesti sur l'autre.
0
Utilisateur anonyme
3 mars 2013 à 12:45
Merci beaucoup de ton aide car je n'y arrive vraiment pas en algo et j'en ai encore plein a faire
0
Utilisateur anonyme
3 mars 2013 à 12:47
quand on déclare notre tableau, on ne sais pas qu'il y a aura 33 valeur
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
3 mars 2013 à 16:14
bonjour,

tt simplement, j'ai pensé un peu bêtement, car la machine l'est aussi.
la solution sera un couple (nbPapierPeint, nbPeinture).

étant donné un bénéfice A, je vais calculer le maximim de nbPapierPeint. Logiquement celui ci sera maximal si nbPeinture vaut 0, alors j'applique les contraintes nbHeureTrvail et argentInvestie sur la variable nbPapierPeint:

1- nbPapierPeint * 12 + 0 * 8 = nbHeureTravail < 390 =>
nbPpaierPeint < 390/12 = 32,5 (33 avec arrondissement)

2- nbPapierPeint * 250 + 0 * 310 = argentInvestie < 12000 =>
nbPapierPeint < 12000/250 = 48

de (1) et (2) on déduit que nbPapierPeint est inférieur à 33.

alors on a 33 cas (valeurs) pr nbPapierPeint, c a dire 33 cas de Bénéfice maximal (en trouvant bien sur la valeur de nbPeinture qui rend le bénéfice maximal).
et en calculant ces 33 cas potentiel de bénéfice, on va garder à chaque étape le bénéfice maximal en le comparant avec le résultat du bénéfice de l'opération précédente ( comme une sorte de trouver le maximum d'un tableau en langage C), et en mémorisant la valeur de nbPapierPeint et nb Peinture qui ont généré ce bénéfice maximal.

ça m'a prix un peu de temps, car en programmation linéaire en math, la solution ou plutot la méthode est très différente (l'homme ne peut pas calculer 33 bénéfice et les comparer, car c'est long et bête, alors il utilise des équation et des graphes, mais la machine peut le faire, car elle est bête et rapide).

c'était un plaisir M. ou Mme natier
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
3 mars 2013 à 16:15
et merci de noter le sujet comme résolut, comem ça les autres internautes auront une meilleur lisibilité de ce sujet.
0