Sum of code subset

Here is my code that prints the elements of a subset whose sum is equal to a given sum (it only works for positive numbers):

#include <bits/stdc++.h>
using namespace std;

void traverse(vector<int> vec) {
    for(int a=0; a < vec.size(); a++)
        cout << vec[a] << " ";
    cout << endl;
}

void possible(vector<int> vec, int sum, vector<int> now) {
    if(sum == 0) {
        traverse(now);
    }
    else if(sum < 0) {
        now.clear();
    }
    else if(sum > 0 && vec.size() > 0) {
        for(int a = 0; a < vec.size(); a++) {
            now.push_back(vec[a]);
            vector<int> vecc(vec.begin() + a + 1, vec.end());
            possible(vecc, sum - vec[a], now);
            now.erase(now.end() - 1);
        }
    }
}

int main() {
    int n, sum;
    cin >> n >> sum;

    vector<int> vec(n), now;
    for(int a = 0; a < n; a++)
        cin >> vec[a];

    possible(vec, sum, now);
    return 0;
}

Are there any chances for improvement or any faster way to improve the runtime?

Any solution to a dynamic problem for this?

+6
source share
3 answers

Subset Sum Problem can be achieved with Dynamic Programmning, as you can read Dynamic Programming | Set 25 (a problem with a subset) .

NP-Complete ( ). , .


:

void traverse(vector<int> vec)

:

void traverse(vector<int>& vec)

, . , .


(, -Wall -Wextra GCC) . .


PS: #include < bits/std++. h > ?

+3

, , , ( ). .

// To make it simple, returns empty vector if no solution was found
// and also if the sum is zero
std::vector<int> find(const std::vector<int>& numbers, int sum)
{
    std::vector<int> result;
    if (findNumbersMakingSum(numbers, sum, result, 0)) {
        return result;
    } else {
        return std::vector<int>();
    }
}

bool findNumbersMakingSum(
    const std::vector<int>& numbers,
    int sumLeft,
    std::vector<int>& takenNumbers,
    size_t position)
{
    if (!sumLeft) {
        // We're done
        return true;
    }

    if (position == numbers.size()) {
        return false;
    }

    int current = numbers[position];
    if (!current) {
        // Just skip zero elements
        return findNumbersMakingSum(numbers, sumLeft, takenNumbers, position + 1);
    }

    // Case 1: take number at current position:
    std::vector<int> taken = takenNumbers;
    taken.push_back(current);
    if (findNumbersMakingSum(numbers, sumLeft - current, taken, position + 1)) {
        takenNumbers = std::move(taken);
        return true;
    }

    // Case 2: don't take number at current position
    return findNumbersMakingSum(numbers, sumLeft, takenNumbers, position + 1);
}

, - . , , , .

+1

this Sum; "" , . - , - .

0

All Articles