#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; } |
English