无和集问题
2015-11-27 20:21
375 查看
#include<iostream> #include<fstream> #include<algorithm> #include "ctime" using namespace std; const int MAXN = 10; const int MAX = 100; int n; int sum[MAXN][MAX]; bool s[MAXN][MAX]; int t[MAX]; int best[MAX]; int k; //搜索的深度,逐渐加深 void out() { for(int i=1; i<=n; i++) //划分个数 { for(int j=1; j<=k; j++) //每个数字 if(i == best[j]) //如果数字j属于第i个划分 cout << j << "\t"; //输出数字j cout << endl; } } void record() { for(int i=1; i<=n; i++) //划分个数 { for(int j=1; j<=k; j++) //每个数字 if(i == t[j]) //如果数字j属于第i个划分 best[j] = i; } } clock_t start, finish; double duration = 0; bool backtrack(int dep) { finish = clock(); duration += (double) (finish-start)/CLOCKS_PER_SEC; start = finish; if(duration > 15.0) { cout << duration << endl; cout << "No Solution!\n"; return false; } if(dep > k) { record(); return true; } for(int i=1; i<=n; i++) //第i个划分 if(sum[i][dep] == 0) { t[dep] = i; //dep被选入划分i中 s[i][dep] = true; for(int j=1; j<dep; j++) if(s[i][j]) //如果数字j已加入划分i中 sum[i][dep+j]++; //j+dep便不能再加入 if(backtrack(dep+1)) return true; for(j=1; j<dep; j++) if(s[i][j]) sum[i][dep+j]--; s[i][dep] = false; } return false; } void search() { k = n; while(true) { memset(sum, 0, sizeof(sum)); memset(t, 0, sizeof(t)); memset(s, 0, sizeof(s)); if(backtrack(1)) ++k; //深度逐渐加大 else break; } --k; } int main() { cout << "输入正整数n:"; cin >> n; search(); cout << "\n计算结果为:F(" << n << ") = " << k << "\n"; out(); //输出划分中的数字 cout << endl; return; }
相关文章推荐
- java URL的打开如果碰到203会自己重定向
- Android编程之BitmapFactory.decodeResource加载图片缩小的原因及解决方法
- 整数变换问题
- Unity IOS Build的Graphics API最好是固定Opengl ES 2.0
- HDOJ 2190 悼念512汶川大地震遇难同胞——重建希望小学 【递推】
- 网络通信加密处理
- 【android】如何让WebView对Video标签的支持更强力
- 秒秒钟将逗号等分割符文件转换成XML和JSON
- php笔记----第十一章 会话控制
- UICollectionViewFlowLayout流布局制作图片瀑布流
- Pythoner使用的豆瓣pip源
- 工具函数
- Logistic Regression Classifier实现 (Python)
- 图邻接表存储 深度优先和广度优先遍历
- php笔记----第十章 文件与目录操作
- 自定义UITableViewCell类 && 自适应高度
- jsp中全局变量和局部变量的设置
- 王学岗帧动画(一)——帧动画的简单实用
- php笔记----第九章 图像处理
- org.hibernate.MappingException: Could not determine type for: Integer, at table XX