#include <iostream> #include<map> #include<vector> #include<queue> using namespace std; map<int, int> ok; vector<vector<long long int>> liczby; unsigned long long int DecToBin(unsigned long long int n) { int a[64]; int i; int liczba_oczek = 0; for (i = 0; n > 0; i++) { a[i] = n % 2; if (a[i] == 1) liczba_oczek++; n = n / 2; } return liczba_oczek; } unsigned long long int funkcja(int n, map<int, int> suma, vector<vector<long long int>> liczby, int ostatnie_oczko, int prawa, long long int wynik, int wywolanie,long long tab[]) { if (wywolanie == n) return wynik; long long int wynik_c_c = -99999999999999999; for (int i = 0; i <= ostatnie_oczko; i++) { map<int, int> suma_copy = suma; int lol = -1; int j = prawa; if (suma[i] > 0) { while (lol != i) { lol = liczby[j][0]; suma_copy[lol] -= 1; j++; } long long int lol5 = wynik + tab[wywolanie] * i; long long int wynik_c = funkcja(n, suma_copy, liczby, ostatnie_oczko, j, lol5, wywolanie+1, tab); if (wynik_c > wynik_c_c) wynik_c_c = wynik_c; } } return wynik_c_c; } int main() { int n; long long int m; cin >> n; cin >> m; int ostatni = 0; for (unsigned long long int i = 0; i <= m; i++) { int oczka = DecToBin(i); if (oczka > ostatni) { ostatni = oczka; } if (ok.find(oczka) != ok.end()) ok[oczka] += 1; else ok[oczka] = 1; vector<long long int> tmp; tmp.push_back(oczka); tmp.push_back(i); tmp.push_back(ok[oczka]); liczby.push_back(tmp); } long long int * tab = new long long int[n]; for (int i = 0; i < n; i++) { long long int lol; cin >> lol; tab[i] = lol; } cout << funkcja(n, ok, liczby, ostatni, 0, 0, 0, tab) << endl; return 0; }
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 88 89 90 91 | #include <iostream> #include<map> #include<vector> #include<queue> using namespace std; map<int, int> ok; vector<vector<long long int>> liczby; unsigned long long int DecToBin(unsigned long long int n) { int a[64]; int i; int liczba_oczek = 0; for (i = 0; n > 0; i++) { a[i] = n % 2; if (a[i] == 1) liczba_oczek++; n = n / 2; } return liczba_oczek; } unsigned long long int funkcja(int n, map<int, int> suma, vector<vector<long long int>> liczby, int ostatnie_oczko, int prawa, long long int wynik, int wywolanie,long long tab[]) { if (wywolanie == n) return wynik; long long int wynik_c_c = -99999999999999999; for (int i = 0; i <= ostatnie_oczko; i++) { map<int, int> suma_copy = suma; int lol = -1; int j = prawa; if (suma[i] > 0) { while (lol != i) { lol = liczby[j][0]; suma_copy[lol] -= 1; j++; } long long int lol5 = wynik + tab[wywolanie] * i; long long int wynik_c = funkcja(n, suma_copy, liczby, ostatnie_oczko, j, lol5, wywolanie+1, tab); if (wynik_c > wynik_c_c) wynik_c_c = wynik_c; } } return wynik_c_c; } int main() { int n; long long int m; cin >> n; cin >> m; int ostatni = 0; for (unsigned long long int i = 0; i <= m; i++) { int oczka = DecToBin(i); if (oczka > ostatni) { ostatni = oczka; } if (ok.find(oczka) != ok.end()) ok[oczka] += 1; else ok[oczka] = 1; vector<long long int> tmp; tmp.push_back(oczka); tmp.push_back(i); tmp.push_back(ok[oczka]); liczby.push_back(tmp); } long long int * tab = new long long int[n]; for (int i = 0; i < n; i++) { long long int lol; cin >> lol; tab[i] = lol; } cout << funkcja(n, ok, liczby, ostatni, 0, 0, 0, tab) << endl; return 0; } |