Guest User

Untitled

a guest
Feb 14th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6.  
  7. #include "AKB4.h"
  8.  
  9. using namespace std;
  10.  
  11. void wczytaj(int &wielkosc, vector<int> &zbior);
  12. bool spr(int c,int wielkosc);
  13. void mapuj(vector<Skladowa> &rozwiazanie, vector<int> &zbior, int liczbaciec, int wielkosczbioru, int start, bool jest,int suma);
  14. int ZnajdzSubMaxWartosc(int maxi, int c, vector<int> tab);
  15. int ZnajdzMaxWartosc(int c, vector<int> tab);
  16.  
  17. int maximum;
  18. int main()
  19. {
  20. int LiczbaCiec = 0, WielkosZbioru = 0;
  21. vector<Skladowa> rozwiazanie;
  22. vector<int> zbior;
  23. bool jest = false;
  24. cout << "podaj ilosc ciec: " << endl;
  25. cin >> LiczbaCiec;
  26. rozwiazanie.reserve(LiczbaCiec+1);
  27. cout << endl;
  28. wczytaj(WielkosZbioru, zbior);
  29. if (spr(LiczbaCiec,WielkosZbioru))//sprawdzamy czy podany zbior jest poprawny
  30. {
  31. cout << " dane wejsiowe poprawne" << endl;
  32. //inicializujemy 1 liczbe do rozwiazania
  33. Skladowa pierwsza;
  34. maximum = ZnajdzMaxWartosc(WielkosZbioru, zbior);
  35. pierwsza.value = ZnajdzMaxWartosc(WielkosZbioru, zbior) - ZnajdzSubMaxWartosc(ZnajdzMaxWartosc(WielkosZbioru, zbior), WielkosZbioru, zbior);
  36. pierwsza.sum = pierwsza.value;
  37. rozwiazanie.push_back(pierwsza);
  38. //szukamy i wyrzucamy nasza 1 wartosc ze zbioru
  39. for (int i = 0; i <= WielkosZbioru;i++)
  40. if (pierwsza.value == zbior.at(i))
  41. {
  42. pierwsza.fromV = i;
  43. pierwsza.fromSum = i;
  44. zbior.at(i) = 0;
  45. break;
  46. }
  47. //===================================================== wypelniamy rozwiazanie
  48. Skladowa nowy;
  49. nowy.value = 0;
  50. for (int i = 1; i<=LiczbaCiec; i++)
  51. rozwiazanie.push_back(nowy);
  52. //===================================================== wypisanie 1 znalezionego elementu
  53. cout << "\n\n";
  54. for (int x = 0; x < rozwiazanie.size(); x++)
  55. cout << rozwiazanie.at(x).value << " ";
  56. cout << "\n";
  57. for (int x = 0; x <zbior.size(); x++)
  58. cout << zbior.at(x) << " ";
  59. mapuj(rozwiazanie,zbior,LiczbaCiec,WielkosZbioru,1,jest, rozwiazanie.at(0).sum);
  60. //=================================================== wypisanie calkowitego rozwiazania
  61. if (jest)
  62. {
  63. cout << "\n\n";
  64. for (int x = 0; x < rozwiazanie.size(); x++)
  65. cout << rozwiazanie.at(x).value << " ";
  66. cout << "\n";
  67. for (int x = 0; x < rozwiazanie.size(); x++)
  68. cout << zbior.at(x) << " ";
  69. }
  70. else cout << "brak roziwazania";
  71.  
  72. }
  73. else cout << "dane wejesciowe nie poprawne";
  74.  
  75.  
  76. _getch();
  77.  
  78. return 0;
  79. }
  80.  
  81. bool spr(int c, int wielksoc)
  82. {
  83. double s1 = 1, s2 = 1;
  84.  
  85. for (int i = 1; i <= c; i++)
  86. s1 *= i;
  87. for (int i = 1; i <= c + 2; i++)
  88. s2 *= i;
  89. cout << s1 << " " << s2 << " " << wielksoc+1 << " " << s2 / (2 * s1) << endl;
  90. if (wielksoc+1 == s2 / (2 * s1))
  91. return true;
  92. else return false;
  93. }
  94. int ZnajdzMaxWartosc(int c, vector<int> tab)
  95. {
  96. int maxi = 0;
  97. for (int i = 0; i <= c; i++)
  98. {
  99. if (maxi<tab[i])
  100. maxi = tab[i];
  101.  
  102. }
  103. return maxi;
  104. }
  105. int ZnajdzSubMaxWartosc(int maxi, int c, vector<int> tab)
  106. {
  107. int semimaxi = 0;
  108. for (int j = 0; j<c; j++)
  109. {
  110. if (tab[j]>semimaxi && semimaxi < maxi)
  111. semimaxi = tab[j];
  112. }
  113. return semimaxi;
  114. }
  115. void wczytaj(int &wielkosc, vector<int> &zbior)
  116. {
  117. fstream plik;
  118. string dane;
  119. int j = 0;
  120. //=========================== preload
  121. plik.open("test.txt", ios::in);
  122. while (!plik.eof())
  123. {
  124. getline(plik, dane, ' ');
  125. wielkosc++;
  126. }
  127. zbior.reserve(wielkosc);
  128.  
  129. plik.clear();
  130. plik.seekg(0, ios::beg);
  131. //========================= load
  132. for (int i = 1; i <= wielkosc; i++)
  133. {
  134. getline(plik, dane, ' ');
  135. zbior.push_back(atoi(dane.c_str()));
  136. }
  137. plik.close();
  138. wielkosc -= 1;
  139. }
  140.  
  141. void mapuj(vector<Skladowa> &rozwiazanie, vector<int> &zbior, int liczbaciec, int wielkosczbioru, int start, bool jest,int suma)
  142. {
  143. if (suma == maximum && start == liczbaciec)
  144. jest = true;
  145. else if (!jest)
  146. {
  147. if (start > liczbaciec || suma > maximum)
  148. return;
  149. else
  150. for (int i = start; i <= liczbaciec; i++)
  151. {
  152. for (int j = 0; j < wielkosczbioru; j++)
  153. {
  154. while (zbior.at(j) == 0)//pomijamy 0
  155. j++;
  156. // if (zbior.at(j) == zbior.at(j - 1))//pomijamy ta sama wartosc
  157. // j++;
  158. if (rozwiazanie.at(i - 1).sum + zbior.at(j) > maximum)//pomijamy wartosc gdy po dodaniu do smumy wieksza od max wartosci
  159. continue;
  160. rozwiazanie.at(i).value = zbior.at(j);
  161. rozwiazanie.at(i).fromV = j;
  162. zbior.at(j) = 0;
  163. if (rozwiazanie.at(i).value == 0)//jesli w tym momencie jest zerem to przeskakujemy na nastepne j
  164. continue;
  165. for (int s = 0; s < wielkosczbioru; s++)
  166. if (rozwiazanie.at(i).value == 0) //jesli w tym momencie jest zerem to przestajemy szukac wyniku dla pary
  167. break;
  168. else
  169. if (rozwiazanie.at(i).value + rozwiazanie.at(i - 1).value == zbior.at(s)) // jesli suma pary znajduje sie w zbiorze przystepujemy do szukania sumy calego rozwiazania
  170. {
  171. cout << "\n\n";
  172. for (int x = 0; x < rozwiazanie.size(); x++)
  173. cout << rozwiazanie.at(x).value << " ";
  174. int sumaPary = rozwiazanie.at(i).value + rozwiazanie.at(i - 1).value;
  175. int indeksSumyPar = s;
  176. if (i - 1 != 1)
  177. {
  178. zbior.at(s) = 0;
  179. rozwiazanie.at(i).sum = rozwiazanie.at(i).value + rozwiazanie.at(i - 1).sum;
  180. } //zapisujemy wartosc sumy}
  181. for (int ss = 0; ss < wielkosczbioru; ss++)
  182. if (rozwiazanie.at(i).sum == 0) //jesli w tym momencie jest zerem to przestajemy szukac wyniku dla sumy calosci
  183. break;
  184. else
  185. if (rozwiazanie.at(i).sum == zbior.at(ss)) //szukamy wartosci dla sumy wszystkiego
  186. {
  187. rozwiazanie.at(i).fromSum = ss; //zapisujemy skad usunelismy sume
  188. zbior.at(ss) = 0;//usuwamy sume ze zbioru
  189. cout << "\n\n";
  190. for (int x = 0; x < rozwiazanie.size(); x++)
  191. cout << rozwiazanie.at(x).value << " ";
  192. cout << "\n";
  193. for (int x = 0; x < zbior.size(); x++)
  194. cout << zbior.at(x) << " ";
  195. if (suma == maximum && start == liczbaciec)
  196. jest = true;
  197. if (i + 1 <= liczbaciec)
  198. mapuj(rozwiazanie, zbior, liczbaciec, wielkosczbioru, ++i, jest, rozwiazanie.at(start).sum);//szukamy dalej
  199. //wyszlismy czyli zwracamy wartosc sumy; zwracamy wartosc dodanego elementu; zwracamy sume pary
  200. cout << "\n\n";
  201. for (int x = 0; x < rozwiazanie.size(); x++)
  202. cout << rozwiazanie.at(x).value << " ";
  203. cout << "\n";
  204. for (int x = 0; x < zbior.size(); x++)
  205. cout << zbior.at(x) << " ";
  206. zbior.at(ss) = rozwiazanie.at(i).sum;
  207. rozwiazanie.at(i).sum = 0;
  208. rozwiazanie.at(i).fromSum = 0;
  209.  
  210.  
  211. }
  212. zbior.at(indeksSumyPar) = sumaPary;
  213. }
  214. if (rozwiazanie.at(i).value != 0)
  215. {
  216. zbior.at(rozwiazanie.at(i).fromV) = rozwiazanie.at(i).value;
  217. rozwiazanie.at(i).value = 0;
  218. }
  219. }
  220. if (jest)
  221. return;
  222. }
  223. }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment