- 题解
1221:分成互质组
- @ 2026-3-21 16:33:34
/*********************************************************************
$PROGRAM$:
$DATETIME$: 2026/3/21 13:34:21
$DESCRIPTION$:
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
int n;
int a[14],b[14];
int ans=INT_MAX;
int nowzu=0;
int gcd(int x,int y){
return y?gcd(y,x%y):x;
}
bool huzhi(int x,int y){
return gcd(x,y)==1;
}
void dfs(int k){
if(k>n){
if(nowzu<ans)
ans=nowzu;
return;
}
bool flag;
for(int i=1;i<=nowzu;i++){
flag=1;
for(int j=1;j<k;j++){
if(b[j]!=i)continue;
if(!huzhi(a[k],a[j])){
flag=0;
break;
}
}
if(flag){
b[k]=i;
dfs(k+1);
}
}
nowzu++;
b[k]=nowzu;
dfs(k+1);
nowzu--;
}
int main() {
//
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(1);
cout<<ans;
return 0;
}
1 条评论
-
yangyu LV 4 @ 2026-3-21 16:50:24
有注释版:
/********************************************************************* $PROGRAM$: $DATETIME$: 2026/3/21 13:34:21 $DESCRIPTION$: *********************************************************************/ #include <bits/stdc++.h> using namespace std; int n; int a[14],b[14]; int ans=INT_MAX;//答案初始化为假想无穷大 (int类型上限) int nowzu=0; int gcd(int x,int y){//辗转相除求最大公约数 return y?gcd(y,x%y):x; } bool huzhi(int x,int y){ return gcd(x,y)==1;//最大公约数为 1 则互质,否则不互质 } void dfs(int k){//放第k个数 if(k>n){//更新答案 if(nowzu<ans) ans=nowzu; return; } bool flag; for(int i=1;i<=nowzu;i++){//尝试将a[k]放入第i个组 flag=1; for(int j=1;j<k;j++){ if(b[j]!=i)continue;//a[j]是否在第i个组中 if(!huzhi(a[k],a[j])){ flag=0;//a[k]与第i个组中至少一个数不互质 ,无法放置 break; } } if(flag){ b[k]=i;//尝试将a[k]放入第i个组 dfs(k+1);//放第k+1个数 } } nowzu++; b[k]=nowzu;//尝试将a[k]放入新的组 dfs(k+1);//放第k+1个数 nowzu--;//恢复状态 } int main() { //输入 cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; dfs(1);//搜索 cout<<ans; return 0; }
- 1