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 82 83 84 85 86 87
|
Author: Andreas Tille <tille@debian.org>
Last-Update: Thu, 23 Jun 2016 09:10:54 +0200
Origin: https://github.com/ekg/multichoose/blob/master/multichoose.h
Description: Provide a needed header file
--- /dev/null
+++ b/src/multichoose.h
@@ -0,0 +1,79 @@
+#ifndef __MULTICHOOSE_H
+#define __MULTICHOOSE_H
+
+/*
+
+multichoose.h -- n multichoose k for generic vectors
+
+author: Erik Garrison <erik.garrison@bc.edu>
+last revised: 2010-04-16
+
+Copyright (c) 2010 by Erik Garrison
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+
+// provides multiset combinations out of the std::vector of objects
+template <class T>
+std::vector< std::vector<T> > multichoose(int k, std::vector<T>& objects) {
+
+ std::vector< std::vector<T> > choices;
+
+ int j,j_1,q,r;
+
+ r = objects.size() - 1;
+
+ // combination indexes
+ std::vector<T*> a, b;
+
+ for (int i=0;i<k;i++) {
+ a.push_back(&objects[0]); b.push_back(&objects[r]);
+ }
+
+ j=k;
+ while(1){
+ std::vector<T> multiset;
+ for(int i=0;i<k;i++)
+ multiset.push_back(*a[i]);
+ choices.push_back(multiset);
+ j=k;
+ do { j--; } while(a[j]==b[j]);
+ if (j<0) break;
+ j_1=j;
+ while(j_1<=k-1){
+ a[j_1]=a[j_1]+1;
+ q=j_1;
+ while(q<k-1) {
+ a[q+1]=a[q];
+ q++;
+ }
+ q++;
+ j_1=q;
+ }
+ }
+
+ return choices;
+}
+
+#endif
|