算法实验4《回溯法》
来源:互联网 发布:淘宝十大作弊违规 编辑:程序博客网 时间:2024/04/27 21:44
1. 编写一个简单的程序,解决8皇后问题。
#include<iostream>using namespace std;bool backtrack(int list[8], int t){if (t >= 8)return true;for (int i = 0; i < 8; i++){list[t] = i;bool place = true;for (int j = 0; j < t; j++)if (list[j] == i || j-t==list[j]-i || j-t==i-list[j])place = false;if (place && backtrack(list, t+1))return true;continue;}return false;}int main(){int list[8];for (int i = 0; i < 8; i++)list[i] = 0;backtrack(list, 0);for (int i = 0; i < 8; i++)cout << list[i] << " ";system("pause>nul");return 0;}
2. 批处理作业调度问题
[问题描述]给定n个作业的集合J=(J1, J2, … , Jn)。每一个作业Ji都有两项任务需要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2, … ,n; j=1,2。
对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和成为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定一个最佳的作业调度方案,使其完成时间和达到最小。
要求输入:
1)作业数 2)每个作业完成时间表:
作业完成时间
机器1
机器2
作业1
2
1
作业2
3
1
作业3
2
3
要求输出: 1)最佳完成时间 2)最佳调度方案
提示:算法复杂度为O(n!),建议在测试的时候n值不要太大,可以考虑不要超过12。
#include<iostream>using namespace std;void backtrack(int *t1, int *t2, int *list1, int *list2, int *list, int &sumTime, int &time, int t, int n){if (t >= n){if (sumTime > time)sumTime = time;return;}for (int i = 0; i < n; i++)//选择1个作业{bool place = true;for (int j = 0; j < t; j++)if (list[j] == i)place = false;//判断这个作业是否可选if (!place)continue;list[t] = i;if (t)t1[t] = t1[t - 1];else t1[t] = 0;t1[t] += list1[i];if (t)t2[t] = (t1[t]>t2[t - 1]) ? t1[t] : t2[t - 1];//这3行计算t2[i]else t2[t] = t1[t];t2[t] += list2[i];time += t2[t];if (time <= sumTime)backtrack(t1, t2, list1, list2, list, sumTime, time, t + 1, n);time -= t2[t];}}int main(){int n;cin >> n;int *list1 = new int[n];//作业在机器1上运行的时间t11-t1nint *list2 = new int[n];//作业在机器2上运行的时间t21-t2nint *t1 = new int[n];//作业在机器1上完成的时间F11-F1nint *t2 = new int[n];//作业在机器2上完成的时间F21-F2nint sumTime = 0;//总时间上界for (int i = 0; i < n; i++){cin >> list1[i] >> list2[i];sumTime += (list1[i] + list2[i])*(i + 1);}int *list = new int[n];//记录作业运行的顺序int time = 0;//总时间backtrack(t1, t2, list1, list2, list, sumTime, time, 0, n);cout << sumTime << endl;system("pause>nul");return 0;}
3. 数字全排列问题
任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。
注意:数字不能重复,N由键盘输入(N<=9)。
#include<iostream>using namespace std;void backtrack(int n,int t,int *list){if (t >= n){for (int i = 0; i < n; i++)cout << list[i]+1 << " ";cout << endl;}for (int i = 0; i < n; i++){bool flag = true;for (int j = 0; j < t; j++)if (list[j] == i)flag = false;if (flag){list[t] = i;backtrack(n, t + 1, list);}}}int main(){int n;cin >> n;int list[9];backtrack(n, 0, list);system("pause>nul");return 0;}
阅读全文
0 0
- 算法实验4《回溯法》
- 算法实验之回溯法解决背包问题
- 南邮算法分析与设计实验3 回溯法
- 第一次实验--NPC问题(回溯算法、聚类分析)
- 第一次实验--NPC问题(回溯算法)
- 常用算法 --- 回溯法
- 算法---->回溯法
- 【算法学习】回溯法
- ACM算法:回溯法
- 算法: 回溯法大全
- 回溯法算法
- [算法]回溯法
- 算法分析与设计实验三 回溯法 24点问题 n皇后问题
- 《算法导论》实验三:最佳调度问题的回溯算法
- 第1次实验——NPC问题(回溯算法)
- 第1次实验 - NPC问题(回溯算法、聚类分析)
- 第一次实验--NPC问题(回溯算法、聚类分析)
- 实验一 NPC问题——回溯算法、聚类分析
- 理解Keystone的4种token
- vue使用axios中 this 指向问题
- java 数字转 字符串 互相转换
- 多目标优化算法day1
- 解决git clone速度慢的问题
- 算法实验4《回溯法》
- 常见的集合类
- JDBC Java数据库连接 3 封装 2017年12月21日 22:47:58
- Android图片的缩放
- XZ_Swift之控制流
- Mac下新安装的MySQL无法登陆root用户的解决方法
- 数据库类型——varchar,varchar2&char
- 2017-12-21 作业1
- 清空jq动画