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