Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Keturiuose cecho baruose gaminami dviejų rūšių gaminiai. Reikia sudaryti tokį gamybos planą, kad atidavus pagamintus gaminius, būtų gautas didžiausias pelnas.
- Pirmame bare dirbama ne daugiau h1 valandų, antrame – h2 valandų, trečiame – h3 valandų ir ketvirtame – h4 valandų. Lentelėje nurodyta, kiek laiko (valandomis) reikia kiekvienos rūšies gaminio daliai pagaminti atitinkamame bare.!!!
- Nulis rodo, kad gaminio gaminime atitinkamas baras nedalyvauja.
- Nulis rodo, kad gaminio gaminimo procese atitinkamas baras nedalyvauja.
- Nulis rodo, kad gaminui pagaminti atitinkamo baro nereikia.
- Atidavęs vieną I rūšies gaminį cechas gauna a Lt pelną, II rūšies – b Lt pelną.
- Parašykite programą, kuri apskaičiuotų, kiek barai turi pagaminti I ir II rūšies gaminių, kad įmonė gautų didžiausią pelną.
- Duomenų faile Duomenys.txt pirmoje eilutėje nurodyta, kokį pelną gauna už I rūšies gaminį ir už II rūšies gaminį;
- antroje eilutėje nurodyta kiek valandų dirba kiekvienas baras;
- trečioje eilutėje I gaminio gaminimo laikas baruose;
- ketvirtoje eilutėje II gaminio gaminimo laikas baruose.
- Rezultatų faile Rezultatai.txt įrašyti:
- 1. Du skaičiai: kiek gaminama I ir II rūšies gaminių;
- 2. Įmonės pelnas pagaminus gaminius.
- Reikalavimai programai:
- Sukurti procedūrą (funkciją void C++), skaičiuojančią, kiek I ir II rūšies gaminių gamina barai, ir įmonės pelną.
- P.S. Baras gali atlikti tik vieną operaciją t.y. tik vienam gaminiui.
- */
- #include<fstream>
- #include<iostream>
- //#include<locale>
- using namespace std;
- const char ivedimo_failas[] = "Duomenys.txt";
- const char isvedimo_failas[] = "Rezultatai.txt";
- const int RUSIU_KIEKIS = 2;
- const int BARU_KIEKIS = 4;
- enum RUSYS {I_RUSIS, II_RUSIS};
- //Tas pats kas: enum RUSYS {I_RUSIS=0, II_RUSIS=1};
- const int EMPTY = -1;
- void skaityti(const char ivedimo_failas[], int& a, int& b, int baro_darbo_laikas[], int operacijos_laikas[][BARU_KIEKIS]) {
- ifstream in(ivedimo_failas);
- in >> a >> b;
- for(int baras = 0; baras < BARU_KIEKIS; ++baras)//barai
- in >> baro_darbo_laikas[baras];
- for(int rusis = 0; rusis < RUSIU_KIEKIS; ++rusis)//gaminių rūšys
- for(int baras = 0; baras < BARU_KIEKIS; ++baras)//barai
- in >> operacijos_laikas[rusis][baras];
- //Galima prirašyti ir in.close(), bet tai nėra būtina, priežasties dabar nėra būtina suprasti. Priežastis - destruktorius įvykdo close() metodą.
- }
- //Susitariame, kad -1 reiškia, kad dar nebuvo įvesta jokia reikšmė („teisinga“)
- inline bool arTuscia(const int reiksme) {
- return reiksme == EMPTY;
- }
- void rasti_optimalu_kieki(const int a, const int b, const int baro_darbo_laikas[], const int operacijos_laikas[][BARU_KIEKIS], int optimalus_gaminiu_kiekis[], int& pelnas) {
- //Vienos rūšies gaminiui pagaminti reikia, kad visos reikalingos operacijos būtų atliktos baruose, kad galima būtų vadinti gaminį pagamintu
- //Užduotyje neparašyta, bet iš rezultatų įmanoma įžiūrėti, kad siekiama vienos dienos optimalaus pelno.
- //Baro darbo laikas turi būti paskirstytas skirtingų rūšių gaminiams gaminti taip, kad pelnas būtų optimalus. Dėmesio! Vienas baras tuo pačiu metu gali gaminti tik vienos rūšies gaminį t. y. atlikti tą vieną operaciją tik vienam gaminiui.
- //Sprendimas paprastas - galimų variantų perrinkimas ieškojimas optimalaus t.y. einant per kombinacijas/variantus ir tikrinant ar tas variantas/kombinacija įmanomas ir jei taip tada ar tai geriausias variantas kuris iki šiol žinomas jei taip tada atnaujinam geriausią žinomą variantą.
- int maks_pagamintu[RUSIU_KIEKIS] = {EMPTY, EMPTY};//Daugiausiai įmanoma pagaminti vienos rūšies gaminių per vieną dieną. Dėmesio! Tai minimali reikšmė iš barų, nes norint užbaigti gaminį reikia turėti visas reikiamas gaminio dalis.
- for(int rusis = 0; rusis < RUSIU_KIEKIS; ++rusis)
- for(int baras = 0; baras < BARU_KIEKIS; ++baras) {
- if(operacijos_laikas[rusis][baras] != 0 &&
- (arTuscia(maks_pagamintu[rusis]) || (!arTuscia(maks_pagamintu[rusis]) && maks_pagamintu[rusis] > baro_darbo_laikas[baras]/operacijos_laikas[rusis][baras] ))) {
- maks_pagamintu[rusis] = baro_darbo_laikas[baras]/operacijos_laikas[rusis][baras];
- }
- }
- pelnas = 0;
- int I_kiekis, II_kiekis;//Skirtingų rūšių kiekiams išbandyti
- //Du (dviems skirtingoms rūšims) for ciklai generuoja skirtingus „pagamintų“ gaminių kiekius.
- for(I_kiekis = 0; I_kiekis <= maks_pagamintu[I_RUSIS]; ++I_kiekis)
- for(II_kiekis = 0; II_kiekis <= maks_pagamintu[II_RUSIS]; ++II_kiekis) {
- bool arGerasKiekis = true;//Tarkim šiems kiekiams visuose baruose užteks laiko pagaminti reikiamas dalis, kad gaminiai būtų pilnai užbaigti.
- for(int baras = 0; baras < BARU_KIEKIS; ++baras) {
- if(baro_darbo_laikas[baras] < operacijos_laikas[I_RUSIS][baras]*I_kiekis + operacijos_laikas[II_RUSIS][baras]*II_kiekis) {//Ar sutelpa į baro darbo laiką
- arGerasKiekis = false;
- break;
- }
- }
- if(arGerasKiekis && pelnas < a*I_kiekis + b*II_kiekis) {
- pelnas = a*I_kiekis + b*II_kiekis;
- optimalus_gaminiu_kiekis[I_RUSIS] = I_kiekis;
- optimalus_gaminiu_kiekis[II_RUSIS] = II_kiekis;
- }
- }
- }
- void isvesti(const char isvedimo_failas[], const int optimalus_gaminiu_kiekis[], const int pelnas) {
- ofstream out(isvedimo_failas);
- out << optimalus_gaminiu_kiekis[I_RUSIS] << " " << optimalus_gaminiu_kiekis[II_RUSIS] << endl;
- out << "pelnas " << pelnas << " Lt";
- }
- int main () {
- //setlocale(LC_ALL,"Lithuanian");
- int a, b,// I ir II gaminio pelnas
- baro_darbo_laikas[BARU_KIEKIS],//baro darbo/veikimo laikas
- operacijos_laikas[RUSIU_KIEKIS][BARU_KIEKIS],//operacijos laikas (val.) gaminio daliai pagaminti baruose
- optimalus_gaminiu_kiekis[RUSIU_KIEKIS],//Dviejų rūšių optimalus gaminių kiekis gauti didžiausiam pelnui
- pelnas;//pelnas litais
- skaityti(ivedimo_failas, a, b, baro_darbo_laikas, operacijos_laikas);
- rasti_optimalu_kieki(a, b, baro_darbo_laikas, operacijos_laikas, optimalus_gaminiu_kiekis, pelnas);
- isvesti(isvedimo_failas, optimalus_gaminiu_kiekis, pelnas);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment