#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
//英语 看博友分析 抄博友程序 dfs 数据结构巧妙 背
int cnt[100];
struct nod{
int start;
int interval;
int times;
/*
nod(int s,int i,int t)
{
start=s;
interval=i;
times=t;
}*/
};
vector<nod> ve;
bool cmp(nod a,nod b)
{
return a.times>b.times;
}
bool check(int a,int b)
{
for(int i=a;i<60;i=i+b)
{
if(cnt[i]==0)
{
return false;
}
}
return true;
}
int ans;
int n;
//抄博友分析 从第k条线路开始匹配 当前已经匹配num个记录 用了sum个公交线路
void dfs(int k,int num,int sum)
{
if(n==num)
{
if(sum<ans)
{
ans=sum;
}
return;
}
for(int i=k;i<ve.size();i++)
{
if(sum+(n-num)/ve[i].times>=ans)//抄博友程序 重要
{
return;
}
if(check(ve[i].start,ve[i].interval))
{
for(int j=ve[i].start; j<60;j+=ve[i].interval)
{
cnt[j]--;
}
dfs(i,num+ve[i].times,sum+1);
for(int j=ve[i].start; j<60;j+=ve[i].interval)
{
cnt[j]++;
}
}
}
}
int main()
{
while(cin>>n)
{
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++)
{
int t;
cin>>t;
cnt[t]++;
}
for(int i=0;i<30;i++)
{
for(int j=i+1;j+i<60;j++)//抄博友程序 背
{
if(check(i,j))
{
ve.push_back((nod){i,j,(59-i)/j+1});//抄博友程序
}
}
}
sort(ve.begin(),ve.end(),cmp);
ans=17;
dfs(0,0,0);
cout<<ans<<endl;
}
return 0;
}