Conditional Selection with Limits on Repetition.
So it's Christmas, and your mum delegates you, for some mysterious reason, to go buy nine (9) balloons - of any of the colours red, orange, yellow, green, blue, indigo, violet, pink, milk, white,- for home decoration.
But here's the catch. You are to buy:- a minimum of 1 red balloon and a maximum of 4 red balloons;
 - a minimum of 1 orange balloon and a maximum of 3 orange balloons;
 - a minimum of 1 yellow balloon and a maximum of 2 yellow balloons;
 - a minimum of 1 green balloon and a maximum of 4 green balloons;
 - a minimum of 1 blue balloon and a maximum of 3 blue balloons;
 - a minimum of 1 indigo balloon and a maximum of 2 indigo balloons;
 - a minimum of 1 violet balloon and a maximum of 4 violet balloons;
 - a minimum of 1 pink balloon and a maximum of 3 pink balloons;
 - a minimum of 1 gray balloon and a maximum of 2 gray balloons;
 - a minimum of 1 white balloon and a maximum of 4 white balloons.
 
                        With these conditions, every family member's favourite colour
                        is covered for, and the decoration mix is also kept lively.
                        
                        This is quite a handful for you to handle...
                    
Code for Limited Repetitive Selection in C++
The code for Selection with Conditioned Repetition will be based on that for Selection with boundless Repetition.
All that is needed after Selection with limitless Repetition is a Productive, as opposed to Summative, check of the results from the Selection with unconditioned Repetition for those options that meet our conditions.
                        This is how our Limited Repetitive Selection algorithm in C++ will work.
                        
                        Create a new C++ class file;
                        Call it ConditionalSelection
.
                        
                        Type out the adjoining C++ code for Selection with Conditioned Repetition.
                    
ConditionalSelection Header File
#include "Selection.h"
#include <array>
class ConditionalSelection : public Selection
{
public:
ConditionalSelection();
virtual ~ConditionalSelection();
vector<vector<string>> limitedSelection(vector<string>, unsigned short, unsigned short[], unsigned short[]);
private:
vector<vector<string>> final_elements;
};
C++ Code for ConditionalSelection Class File
#include "ConditionalSelection.h"
#include <iostream>
ConditionalSelection::ConditionalSelection() : Selection()
{
}
vector<vector<string>> ConditionalSelection::limitedSelection(vector<string> candidates, unsigned short dimension, unsigned short minimum[], unsigned short maximum[]) {
final_elements = {};
groupSelection(candidates, dimension);
for (int i = 0; i < complete_group.size(); i++) {
bool state = false;
for (int j = 0; j < words.size(); j++) {
// get 'words[j]' frequency/count in group
int frequency = count(complete_group[i].begin(), complete_group[i].end(), words[j]);
if (frequency >= minimum[j] && frequency <= maximum[j]) {
state = true;
}
else {
state = false;
break;
}
}
// skip if already in net
if (state) {
final_elements.push_back(complete_group[i]);
}
}
return final_elements;
}
ConditionalSelection::~ConditionalSelection()
{
}
Main Class
#include "ConditionalSelection.h"
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<string> goods = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
unsigned short min_occurrence[]{ 0, 0, 1, 0, 0, 1, 0, 0, 1, 0 };
unsigned short max_occurrence[]{ 4, 3, 2, 4, 3, 2, 4, 3, 2, 4 };
ConditionalSelection choose;
vector<vector<string>> result = choose.limitedSelection(goods, 4, min_occurrence, max_occurrence);
// print choices and operation
cout << "\n[ ";
for (string choice : choose.words) {
cout << choice << "; ";
}
cout << "] conditioned selection " << choose.r << ":\n\n";
// print out selections nicely
int i = 0;
for (vector<string> set : result) {
i++;
cout << i << ": ";
for (string member : set) {
cout << member << "; ";
}
cout << "\n";
}
cout << "\nNumber of ways is " << result.size() << ".";
return 0;
}