#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int maxn = 100 + 10;
const int INF = 1e9;
int n;
int d[maxn],p[maxn];
int G[maxn][maxn];
bool no_edges_inside(int s) {
for (int i = 0; i < n; i++) {
if (s&(1 << i)) {
for (int j = i+1; j < n; j++) {
if (s&(1 << j)) {
if (G[i][j])return false;
}
}
}
}
return true;
}
int main()
{
for (int s = 1; s < 1 << (n - 1); s++) {
d[s] = INF;
for (int s0 = s; s0; (s0 - 1)&s) {
if (no_edges_inside(s0))d[s] = min(d[s], d[s - s0] + 1);
}
}
cout << d[1 << (n - 1) - 1] << endl;
return 0;
}