#include #include #include using namespace std; bool containsSubset( const vector & v, int k, vector & subset ); bool containsSubsetRecursive( const vector & v, int k, vector & subset, int low ); // Returns true if a subset of v adds to exactly k. // The vector subset will contain the subset. // Otherwise, returns false, and subset is undefined. bool containsSubset( const vector & v, int k, vector & subset ) { subset.resize( 0 ); return containsSubsetRecursive( v, k, subset, 0 ); } // Recursive helper. // Returns true if a subset of v, starting at position low, adds to exactly k. // The vector subset will contain the subset. // Otherwise, returns false, and subset is undefined. bool containsSubsetRecursive( const vector & v, int k, vector & subset, int low ) { if( k == 0 ) { subset.resize( 0 ); return true; } if( low == v.size( ) ) return false; if( containsSubsetRecursive( v, k, subset, low + 1 ) ) return true; if( containsSubsetRecursive( v, k - v[ low ], subset, low + 1 ) ) { subset.push_back( v[ low ] ); return true; } subset.resize( 0 ); return false; } void check( const vector & v, int sum ) { vector subset; bool result; result = containsSubset( v, sum, subset ); if( result ) { for( int j = 0; j < subset.size( ); j++ ) cout << subset[ j ] << endl; cout << endl; } else cout << "No subset." << endl; } int main( ) { vector v; int x; cout << "Enter some numbers; * to exit: "; while( cin >> x ) v.push_back( x ); // Digest the * cin.clear( ); string str; cin >> str; cout << "Enter numbers to check for sums: "; while( cin >> x ) check( v, x ); return 0; }