Bonjour,
Je doit réaliser un programme qui calcul et retourne la production journalière de rouleau de papier peint et de pot de peinture ainsi que le bénéfice maxi.
Voici les donnée:
390 heures de travail possible
12 000 € d'investissement possible
1 lot de papier = 120 rouleau, coute 250 € par lot, 12 heure de travail par lot
1 lot de peinture = 90 pots, coute 310 € par lot, 8 heure de travail par lot
voici ce que j'ai fait en java mais sa va pas. Pouvez-vous m'aidez à trouver mes erreur
int nbPapierPeint = 0;
int nbPeinture = 0;
int beneficeMaximal = 0;
int nbHeureTravail = 0;
int argentInvestie = 0;
nbHeureTravail = (nbPapierPeint / 12) + (nbPeinture / 8);
argentInvestie = (nbPapierPeint / 250) + (nbPeinture / 310);
while (nbHeureTravail <=390 && argentInvestie <= 12000)
{
nbPapierPeint = nbPapierPeint + 1;
nbPeinture = nbPeinture + 1;
}
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);
il faut mettre
nbHeureTravail = (nbPapierPeint / 12) + (nbPeinture / 8);
argentInvestie = (nbPapierPeint / 250) + (nbPeinture / 310);
dans la boucle
tes équay=tions sont fausses
nbHeureTravail = (nbPapierPeint * 12) + (nbPeinture * 8);
argentInvestie = (nbPapierPeint * 250) + (nbPeinture * 310);
mais je ne sais si tonprogramme va fonctionner car selon moinbpapier=nbpeinture n'est pa forcément à respecter
à chaque boucle tu augmentes de 1 la quantité de papier et de peinture
comme les 2 valent au départ 0
après x boucles les 2 valent x
ce n'est pas comme ça que tu trouveras la meilleur profit pour 390h ou 12000€ d'investissement
mais je connais plus les méthodes qui permettent de trouver la réponse
un algorithme permet de faire à un ordinateur ce qu'on sait faire soit même.
le profit max est 1715€ pour 15 papier et 26 peinture
j'ai fait ça grâce à un simple fichier excel, si ça t'interesse je t'expliquerais demain
Le principe que j'ai imaginé est de calculer le nombre maxi de papier qu'on peut produire (si il n'ya avait que ça à produire)
Puis de faire une boucle qui calcule la peinture réalisable avec le reste d'argent et d'heures
A chaque tour, on calcule le bénéfice réaliser avec les x peinture et les y papier peint
Puis on garde le meilleur des cas.
Je ne connais pas JAVA donc il y aura peut-être des erreurs de syntaxe (pour les formules j'utilise les formules d'excel à traduire peut-être)
int nbPapierPeint = 0;
int nbPapierOptimal = 0;
int nbPapierPeintMax =0;
int nbPeintureOptimal = 0;
int nbPeinture = 0;
int benefice = 0;
int beneficeMaximal = 0;
int nbHeureTravail = 0;
int nbHeureTravailRestant = 0;
int argentInvestie = 0;
int argentRestant = 0;
string Verification = « Attention le montant d'argent à investir et/ou le nombre d'heure dépassent la limite »;
nbPapierPeintMax = ent(min(12000/250;390/12));
« je calcule ici la production de papier peint si c'était la production prioritaire et que la peinture n'est fait que pour utiliser les ressources restantes »
while (nbPapierPeint nbPapierPeintMax)
{
argentRestant = 12000-nbPapierPeint*250;
nbHeureTravailRestant = 390-nbPapierPeint*12;
nbPeinture = ent(min(argentRestant/310;nbHeureTravailRestant/8));
« je calcule ici la production possible de peinture en utilisant ce qui est laissé par le papier peint »
benefice = 45*nbPapierPeint+40*nbPeinture;
if benefice > beneficeMaximal
{
« j'enregistre ici les information si le bénéfice est plus grand que ceux trouvés jusqu'à présent »
beneficeMaximal = benefice;
nbPapierOptimal = nbPapierPeint;
nbPeintureOptimal = nbPeinture;
}
nbPapierPeint = nbPapierPeint+1;
}
if 12000 >= nbPeintureOptimal *310+ nbPapierOptimal*250
{
if 390 >= nbPeintureOptimal *8+ nbPapierOptimal*12
{
Verification = « Le montant d'argent à investir et le nombre d'heure ne sont pas dépassés » ;
« je vérifie que les contraintes d'argent et heures maxi sont vérifiées »
}
}
System.out.println (Verification );
System.out.println("Le nombre de lots de rouleaux de papier peint est de " + nbPapierOptimal);
System.out.println("Le nombre de lots de pots de peinture est de " + nbPeintureOptimal);
System.out.println("Le bénéfice maximal est de " + beneficeMaximal);
Personnellement je remplacerait tout les nombre du programme par des variables
int argentInvestieMax = 0;
int NbHeuresMax = 0;
int CoutPeinture = 0;
int CoutPapier = 0;
int HeuresPeinture = 0;
int HeuresPapier = 0;
int BenefPeinture = 0;
int BenefPapier = 0;
Et je demanderais au programme de demander les valeurs de ces variables.
Si il y avait 3 ressources, il y aurait une 3e boucle imbriquée
Calcul papierpeint max
Boucle de sur le papier peint
Calcul peinture max (compte tenu de ce qui reste en argent et heures)
Boucle sur la peinture
Calcul quantité3 (compte tenu de ce qui reste en argent et heures)
Bénéfice(papier peint, peinture, quantité3)
Enregitrement
Peinture+1
papier peint+1
avec le fichier excel c'est plus simple,
si tu veux que je te l'envoie mets une adresse mail dans ton profil.
Une fois de plus je ne connais pas java, je n'ai donc pas testé l'algorithme, dis moi s'il fonctionne ou si tu ne comprends pas certaines formules
elle doit être masquée rend la visible ou fais en une bidon et poste là ici, je t'enverrai le fichier
Dans tous les cas refais un message quand c'est fait
j'ai fait mais sa va pas: je trouve 1 lots de papier et 39 lots de peinture
int nbPapierPeint = 0;
int nbPeinture = 0;
int beneficeMaximal = 0;
int nbHeureTravail = 0;
int argentInvestie = 0;
while (nbHeureTravail <=390 && argentInvestie <= 12000)
{
nbHeureTravail = (nbPapierPeint * 12) + (nbPeinture * 8);
argentInvestie = (nbPapierPeint * 250) + (nbPeinture * 310);
nbPapierPeint = nbPapierPeint + 1;
while (nbHeureTravail <=390 && argentInvestie <= 12000)
{
nbHeureTravail = (nbPapierPeint * 12) + (nbPeinture * 8);
argentInvestie = (nbPapierPeint * 250) + (nbPeinture * 310);
nbPeinture = nbPeinture + 1;
}
}
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);
si tu n'utilises pas le mien ou un truc qui fonctionne de la même façon, tu ne trouveras pas la bonne réponse
Bonjour
Dans ton exemple, tu ne calcule pas le bénéfice maximal, mais le bénéfice dans le cas où tu achetes autant de lots de peinture et de papier.
Il faut donc faire varier le nombre de lots de papier peint et de peinture pour attendre un bénéfice maximal en respectant les contraintes de l'énoncé.
int beneficeActuel=0;
int beneficeMaximal = 0;
for(int nbLotPapierPeint=0; nbLotPapierPeint<32;nbLotPapierPeint++)
//ici 390/12=32.5 et 12000/250=48, donc c'est le nombre d'heure qui est limitant, donc on va jusqu'à 32
{
for(int nbLotPeinture=0; nbLotPeinture<38;nbLotPeinture++)
//ici 390/8=48.75 et 12000/310=38.70, donc c'est l'investissement qui est limitant, donc on va jusqu'à 38
{
//verification des contraintes
if((nbLotPapierPeint*12+nbLotPeinture*8 <=390) &&(nbLotPapierPeint*250+nbLotPeinture*310 <= 12000))
{
//calcul du bénéfice pour ce cas (pas forcément le maximal)
beneficeActuel=(nbLotPapierPeint * 45) + (nbLotPeinture * 40);
//je me fie à ton calcul, je sais pas si ces valeurs sont vraiement des bénéfices par lot pour par rouleau/pot
if(beneficeActuel>beneficeMaximal)
//si le bénéfice de cette configuration est plus grand que le record, on met à jour le record
{
beneficeMaximal=beneficeActuel;
}
}
}
}
Tu as ici le bénéfice maximal en sortie de boucle. Par contre, il faudrait également à chaque changement du maximum, enregistrer le nombre de lots de chaque qui maximise le bénéfice
Je suis pas censé de savoir que c égal ou inférieur à 32 et 38
Je doit rien calculer moi, c le programme qui calcul tout
Bah tu peux, c'est le min de 390/12 et 12000/250 d'une part et le min de 390/8 et 12000/310 d'autre part.
Comme lamat l'indiquait
Et c'est juste pour borner les boucles. C'est utile si tu veux changer les valeurs d'entrée, enfin fait comme tu veux
C'est surtout pour améliorer la performance de l'algorithme de savoir ces valeurs
Le fait que ce soit le programme qui calcule ne t'empeche pas de lui faciliter la tache, et de l'empecher de faire des calculs inutiles. Donc apporter un peu d'intelligence à une machine
Mais dans le for je fait comment si je mais pas 32 et 38?
je met une variable nbPapierPeintMax et nbPeintureMax?
JE vois pas trop ce que je doit modifier dans mon dernier programme que j'ai posté. Peut-tu me dire ou je doit rajouter et supprimer des truc stp
tot le dernier programme que tu as posté 26-04-13 à 15:00, ne fonctionne pas et ne fonctionnera jamais
pour que ça focntionne, il faut faire ce que Eric1 et mi avons fait:
2 boucles imbriquées
le problème, c'ets qu'avec ton algo, tu ne trouves pas le bénéfice maximal, mais le premier bénéfice qui sort de la boucle
Il faut tester toutes les possibilités
Essaie de la dérouler pas à pas, tu verras
imagine un tableau à deux dimensions, dans lequel tu as le nombre de lots de peinture en abscisse et le nombre de lots de papier en ordonnées.
Si tu ne prends pas de papier, mais que de la peinture, tu peux prendre maximum 38 lots de peinture.
Si tu ne prends pas de peinture, mais que du papier, tu peux prendre maximum 32 lots.
Et il y a toutes les valeurs intermédiaires: genre 10 lots de peinture 15 lots de papier, en fait toutes les valeurs entre [0 et 38] de peinture, et [0 et 32 ] de papier
Tout en respectant les contraintes, car 38 de peinture + 32 de papier fait bien le maximum des bénéfices, mais ne respecte pas le budget et les heures
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :