Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C by dasd ( 3 years ago )
#include <iostream>
#include <cstdlib>
#include <chrono>
#include <iomanip>

using namespace std;
using namespace std::chrono;

int counter_knapSack = 0;
int counter_metodaZachlanna = 0;

double max(double a, double b) {
    return (a > b) ? a : b;
}

double knapSack(int W, double* wt, double* val, int n) {
    counter_knapSack++;

    auto startTime = high_resolution_clock::now();

    if (n == 0 || W == 0)
        return 0;

    if (wt[n - 1] > W)
        return knapSack(W, wt, val, n - 1);
    else
        return max(
                val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1),
                knapSack(W, wt, val, n - 1)
        );

    auto endTime = high_resolution_clock::now();
    auto elapsedTime = duration_cast<nanoseconds>(endTime - startTime).count();
    double timeInNanoseconds = static_cast<double>(elapsedTime);

    cout << "Czas wykonania knapSack: " << fixed << setprecision(0) << timeInNanoseconds << " nanosekund" << endl;
}

void generowanie_liczb(double* cena, double* waga, int* index, int n) {
    for (int i = 0; i < n; i++) {
        cena[i] = (rand() % 600) / 100.0;
        waga[i] = (rand() % 600) / 100.0;
        index[i] = i;
    }
}

void wyswietlanie_produktow(double* cena, double* waga, int* index, int n) {
    cout << "Produkty:" << endl;
    for (int i = 0; i < n; i++) {
        cout << "Produkt " << index[i] << ": Cena=" << cena[i] << ", Waga=" << waga[i] << endl;
    }
}

double metoda_zachlanna(double* cena, double* waga, int* index, int n, int pojemnosc) {
    counter_metodaZachlanna++;

    auto startTime = high_resolution_clock::now();

    double saldo = 0.0;
    double* oplacalnosc = new double[n];
    for (int i = 0; i < n; i++) {
        oplacalnosc[i] = cena[i] / waga[i];
    }
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++)
            if (oplacalnosc[j] < oplacalnosc[j + 1]) {
                swap(cena[j], cena[j + 1]);
                swap(waga[j], waga[j + 1]);
                swap(oplacalnosc[j], oplacalnosc[j + 1]);
                swap(index[j], index[j + 1]);
            }
    }

    for (int i = 0; i < n; i++) {
        if (pojemnosc - waga[i] >= 0) {
            pojemnosc -= waga[i];
            saldo += cena[i];
        }
    }

    delete[] oplacalnosc;

    auto endTime = high_resolution_clock::now();
    auto elapsedTime = duration_cast<nanoseconds>(endTime - startTime).count();
    double timeInNanoseconds = static_cast<double>(elapsedTime);

    cout << "Czas wykonania metoda_zachlanna: " << fixed << setprecision(0) << timeInNanoseconds << " nanosekund" << endl;

    return saldo;
}

int main() {
    srand(time(NULL));

    int ilosc;
    double alg_aproksymacyjny;
    double alg_dokladny;

    cout << "Podaj ile egzemplarzy danych wygenerowac: ";
    cin >> ilosc;

    int n;
    cout << "Podaj ile przedmiotów chcesz wygenerowac: ";
    cin >> n;

    double pojemnosc;
    cout << "Podaj pojemność plecaka: ";
    cin >> pojemnosc;

    printf("Algorytm aproksymacyjny Algorytm dokladny Dokladnosc\n");
    for (int i = 0; i < ilosc; i++) {
        double* cena = new double[n];
        double* waga = new double[n];
        int* index = new int[n];

        generowanie_liczb(cena, waga, index, n);

        counter_knapSack = 0;
        counter_metodaZachlanna = 0;

        auto startZachlanna = high_resolution_clock::now();
        alg_aproksymacyjny = metoda_zachlanna(cena, waga, index, n, pojemnosc);
        auto endZachlanna = high_resolution_clock::now();
        auto czas_zachlanna = duration_cast<nanoseconds>(endZachlanna - startZachlanna).count();

        auto startKnapSack = high_resolution_clock::now();
        alg_dokladny = knapSack(pojemnosc, waga, cena, n);
        auto endKnapSack = high_resolution_clock::now();
        auto czas_knapsack = duration_cast<nanoseconds>(endKnapSack - startKnapSack).count();

        printf("%.2f %.2f %.2f\n", alg_aproksymacyjny, alg_dokladny, alg_aproksymacyjny / alg_dokladny * 100);
        cout << "Czas wykonania metoda_zachlanna: " << fixed << setprecision(0) << czas_zachlanna << " nanosekund" << endl;
        cout << "Czas wykonania knapSack: " << fixed << setprecision(0) << czas_knapsack << " nanosekund" << endl;
        cout << "Liczba operacji metoda_zachlanna: " << counter_metodaZachlanna << endl;
        cout << "Liczba operacji knapSack: " << counter_knapSack << endl;

        delete[] cena;
        delete[] waga;
        delete[] index;
    }

    return 0;
}

 

Revise this Paste

Your Name: Code Language: