Podział zbioru

0

Witam, jestem początkująca potrzebowałam pomocy z zadaniu z podziałem zbioru ma on losował randomowo elementy i wagi oraz wynik nie jest poprawny.

Zrzut ekranu 2023-01-9 o 13.54.33.png

#include <iostream>
#include <vector>
using namespace std;
 
int main() {
    setlocale(LC_ALL, "");
     
    vector<int> C;
     
    vector<int> s;
     
    vector<int> C_sub;
     
    int sum_C = 0;
     
    int sum_C_sub = 0;
 
     
    int q;
    cout << "Podaj liczbe elementow: ";
    cin >> q;
 
    cout << "Podaj elementy zbioru C i wagi: " << endl;
    for (int i = 0; i < q; i++) {
        int c;
        int weight;
        cin >> c >> weight;
        C.push_back(c);
        s.push_back(weight);
        sum_C += weight;
    }
 
     
    int i = 0;
    while (sum_C_sub <= sum_C / 2 && i < q) {
        sum_C_sub += s[i];
        C_sub.push_back(C[i]);
        i++;
    }
 
     
    if (sum_C_sub == sum_C - sum_C_sub) {
        cout << "Istnieje taki podzbior że C` zawiera sie C taki, że suma po ci nalezy do C` od s(ci) = suma po ci nalezy do C - C` od s(ci)." << endl;
        cout << "Podzbior C` to: ";
        for (int element : C_sub) {
            cout << element << " ";
        }
        cout << endl;
    }
    else {
        cout << "Nie istnieje podzbior taki że C` zawiera się C taki, że suma po ci należy do C` od s(ci) = suma po ci nalezy do C - C` od s(ci)." << endl;
    }
 
    return 0;
}

0

Jeżeli obrazek jest poprawny oraz wagi nie mogą być ujemne (co przeważnie ma sens w większości zagadnień) to odpowiednim algorytmem będzie:
Min(S(i))==0

0

Nic dziwnego, że wynik nie jest poprawny - przykładowo, mam wrażenie, że dla danych wag 1 5 1 1 1 1 powiesz, że się nie da - a przecież starczy wstawić piątke do C', a jedynki do C - C'.

0

@narusia: A są jakies przykłady?

1

Ja polecam zainteresować się pisaniem testów i z ich pomocą próbować rozwiązać zadanie.
Tu przykładowe testy w Catch2, ale bez rozwiązania: https://godbolt.org/z/zr4sbdqee
Po prostu popraw funkcję halfWeigthSubset tak, by wszystkie testy nie zgłaszały błedów.

Dobrze by było jakbyś oduczył(a) się pisać wszystko w main, dziel problem na małe funkcje, które robią małe zadania.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.