问题描述:
解题思路:
因为数据规模不大,因此我们可以从由1到10枚举全部可能答案,当符合时输出。使用dfs判断合法性,
题解:
#include<bits/stdc++.h>
using namespace std;
const int N = 15;
int a[N], n;
vector<int> v[N]; // v[i]:第i号队
bool dfs(int cnt, int dep) // cnt:队伍数 dep:第几层/第几个元素 dfs:判断cnt时从dep开始是否合法
{
if(dep == n + 1)
{
return true;
}
for(int i = 1; i <= cnt; i++) // 枚举每个队伍,将当前dep的学生放到i号队伍中**
{
bool tag = true;
for(const auto &j : v[i]) // 剪枝:当i号队伍不能放时跳过到下一个队伍
if(a[dep] % j == 0 )
{
tag = false;
break;
}
if(!tag)continue;
v[i].push_back(a[dep]); // 将dep层元素放入到i号队伍中
if(dfs(cnt, dep + 1))return true; // 如果合法返回true
v[i].pop_back(); // 恢复现场(如果dep学生放入i中会导致最终不合法则将其弹出)**
}
return false; // 如果无法到最后一层则证明不合法,返回false
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)cin >> a[i];
sort(a + 1, a + n + 1); // 排序后则在出口用后面%前面 == 0,判断合法
for(int i = 1; i <= n; i++)
{
if(dfs(i, 1))
{
cout << i << '\n';
break;
}
}
return 0;
}
知识点:dfs,剪枝