有2种dfs的方法:

1.存下每个组的各个数和其质因数,每次对于新的一个数,与各组比对是否互质,再添加或不添加入该组。

2.不存质因数了,直接用gcd,更加快。P.S.然而我不知道为什么RE,若有好心人发现请教教我吧,谢谢~ :-)

下面附上方法1的AC代码——

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6 using namespace std;
7
8 int n,ans=12;
9 int a[12];
10 struct node {int t;int p[3000];}
11 b[12];
12
13 int mmin(int x,int y)
14 { return x<y?x:y; }
15 int com(int id,int x)
16 {
17 for (int i=1;i<=b[id].t;i++)
18 if (x%b[id].p[i]==0) return 0;
19 return 1;
20 }
21 void dfs(int id,int h)
22 {
23 int x=a[id];
24 if (id>n) {ans=mmin(ans,h); return;}
25 for (int i=1;i<=h;i++)
26 if (com(i,x))
27 {
28 int y=x,tt=b[i].t;
29 for (int j=2;j<=y;j++)//sqrt(y) wrong
30 if (y%j==0) y/=j, b[i].p[++b[i].t]=j;
31 dfs(id+1,h);
32 b[i].t=tt;
33 }
34 int y=x;
35 b[h+1].t=0;
36 for (int j=2;j<=y;j++)
37 if (y%j==0) y/=j, b[h+1].p[++b[h+1].t]=j;
38 dfs(id+1,h+1);
39 }
40 int main()
41 {
42 scanf("%d",&n);
43 for (int i=1;i<=n;i++)
44 scanf("%d",&a[i]);
45 dfs(1,0);
46 printf("%d",ans);
47 return 0;
48 }

方法2的90分RE代码——

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 using namespace std;
6
7 const int N=15;
8 int n,ans;
9 int a[N],b[N][N],t[N];
10
11 int mmin(int x,int y)
12 { return x<y?x:y; }
13 int gcd(int x,int y)
14 { return (!y)?x:gcd(y,x%y); }
15 bool addit(int x,int i)
16 {
17 for (int j=1;j<=t[i];j++)
18 if (gcd(x,b[i][j])!=1) return false;
19 return true;
20 }
21 void dfs(int x,int h)
22 {
23 if (x>n) {ans=mmin(h,ans);return;}
24 for (int i=1;i<=h;i++)
25 if (addit(a[x],i))
26 {
27 b[i][++t[i]]=a[x];
28 dfs(x+1,h);
29 t[i]--;
30 }
31 b[h+1][++t[h+1]]=a[x];
32 dfs(x+1,h+1);
33 }
34 int main()
35 {
36 scanf("%d",&n);
37 for (int i=1;i<=n;i++)
38 scanf("%d",&a[i]);
39 memset(t,0,sizeof(t));
40 ans=N;
41 dfs(1,0);
42 printf("%d\n",ans);
43 return 0;
44 }

其实noi上的数据还有个问题——1应该专门放在一组中,而该题数据没有考虑到这点......

最新文章

  1. C# 实时折线图,波形图
  2. flex 布局笔记
  3. RabbitMQ 声明Queue时的参数们的Power
  4. Aoite 系列(04) - 强劲的 CommandModel 开发模式(上篇)
  5. 原生JS:Math对象详解
  6. HDU5772 (最小割)
  7. 剑指offer系列54---数组中出现次数超过一半的数
  8. require.js入门指南(二)
  9. C++对象的自销毁
  10. bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)
  11. PHP中的超级全局变量
  12. SCU 3132(博弈)
  13. 分享.net常见的内存泄露及解决方法
  14. css实现下拉菜单
  15. Node.js系列:Buffer类的使用
  16. 【easy】437. Path Sum III 二叉树任意起始区间和
  17. angularjs异步处理 $q.defer()
  18. 《SQL 基础教程》第三章:聚合和排序
  19. AWS学习笔记
  20. Lily-一个埋点管理工具

热门文章

  1. go判断字符串是否是IP地址
  2. Navcat连接Mysql报错1521
  3. LeetCode53 最大子序列问题
  4. Thread线程源码解析,Java线程的状态,线程之间的通信
  5. python学习笔记 | PyCharm创建文件时自动添加头文件
  6. 【Linux】ssh远程连接到指定ip的指定用户上
  7. HarmonyOS三方件开发指南(5)——Photoview组件
  8. kubernets之向外部应用暴露应用
  9. leetcode230. 二叉搜索树中第K小的元素
  10. AWD生存之道