1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
#include <ctime>
/*affiche un vecteur*/
void afficherMongaulois(const std::vector<int> & list)
{
std::cout<<"[";
std::copy(list.begin(),list.end()-1,std::ostream_iterator<int>(std::cout,", "));
std::cout<< *list.rbegin()<<"]\n ";
}
/*calcul la somme d'un vecteur*/
int sommeMongaulois(const std::vector<int> & list)
{
return std::accumulate(list.begin(),list.end(),0);
}
/*met tout le vecteur à 1 sauf le premier élément à n*/
void mettrePremierNMongaulois(std::vector<int> & list,const int &n)
{
list[0] = n;
std::fill(list.begin()+1,list.end(),1);
}
/*genère la combinaison suivante suivant un critère très particulier*/
void genererSuivantMongaulois(std::vector<int> & list)
{
std::vector<int>::reverse_iterator it = std::adjacent_find( list.rbegin(), list.rend(),std::less<int>());
if(list.rend()!=it)
(*it)++;
else
(*list.begin())++;
}
/*génère l'ensemble des solutions dont la taille du vecteur vaut taille*/
void generationSolutionMongaulois(int n, int taille)
{
static std::vector<int> list;
list.resize(taille);
std::fill(list.begin(),list.end(),1);
for(int i=n/taille; i<=n+1-taille; i++)
{
int total = 0;
mettrePremierNMongaulois(list, i); //somme vaut i>=n+1-taille
//dans la boucle, ça sera au maximum = taille * i
while(total<=n && list[0]==i)
{
total = sommeMongaulois(list);
if(total == n)
afficherMongaulois(list);
if(total >=n)
break;
genererSuivantMongaulois(list);
}
}
}
/*génère l'ensemble des solutions*/
void generationSommeMongaulois(int n)
{
for(int taille = n; taille>0; taille--)
generationSolutionMongaulois(n, taille);
}
int main(int argc,char ** argv)
{
int nb = 100;
generationSommeMongaulois(nb);
return 0;
} |
Partager