ccf-csp 任务调度,回溯算法我觉得ok神**wa了

 1 #include<iostream>
 2 #include<string.h>
 3 #include<cmath>
 4 #define M 41
 5 #define min(a,b) (a<b?a:b)
 6 #define max(a,b) (a>b?a:b)
 7 #define inf 1<<30
 8 using namespace std;
 9 int time[M][4];
10 int c1, c2, com, g, stime;//c1 c2存两个独立cpu的时间(不是同时进行 com存同时进行的时间 g存gpu的时间
11 int n;
12 void slove(int k, int c1, int c2, int com, int g, int sum)
13 {
14     if (k <= n)
15         for (int i = 0; i < 4; i++)
16             switch (i)
17             {
18             case 0://1*cpu
19                 c1 < c2 ? slove(k + 1, c1 + time[k][i], c2, com, g, max(max(c1 + time[k][i], c2) + com, g)) :
20                     slove(k + 1, c1, c2 + time[k][i], com, g, max(max(c1, c2 + time[k][i]) + com, g));
21                 break;
22             case 1://2*cpu
23                 slove(k + 1, c1, c2, com + time[k][i], g, max(max(c1, c2) + com + time[k][i], g));
24                 break;
25             case 2:
26                 c1 < c2 ? slove(k + 1, c1 + time[k][i], c2, com, g + time[k][i], max(max(c1 + time[k][i], c2) + com, g + time[k][i])) :
27                     slove(k + 1, c1, c2 + time[k][i], com, g + time[k][i], max(max(c1, c2 + time[k][i]) + com, g + time[k][i]));
28                 break;
29             case  3:
30                 slove(k + 1, c1, c2, com + time[k][i], g + time[k][i], max(max(c1, c2) + com + time[k][i], g + time[k][i]));
31                 break;
32             }
33     else
34         if (stime >sum)
35             stime = sum;
36 }
37 int main()
38 {
39     stime = inf;
40     c1 = c2 = g = com = 0;//初始化
41     cin >> n;
42     for (int i = 1; i <= n; i++)
43         for (int j = 0; j < 4; j++)
44             cin >> time[i][j];
45     slove(1, 0, 0, 0, 0, 0);
46     cout << stime << endl;
47     return 0;
48 }
时间: 2024-10-18 00:26:44

ccf-csp 任务调度,回溯算法我觉得ok神**wa了的相关文章

8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

回溯0--递归回溯算法框架

递归回溯算法框架 一.心得 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 search后面的k是轮数  三个数组:原数据数组标记数组储存结果数组 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 二.代码 1 /* 2 递归回溯算法框架: 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 6 */ 7 /* 8 框架一 9 */ 10 int se

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

数据结构之回溯算法

借鉴:http://blog.csdn.net/baple/article/details/7181404 package database; public class NQuee { public static boolean Verify(int arr[],int i){                              //仅仅判断能不能放置这个皇后        for(int k =1;k != i;k++)                                  

【八皇后问题】 回溯算法

回溯算法:回溯算法实际上是一个类似枚举的搜索尝试方法,它的思想是在搜索尝试中寻找问题的解,当发现不满足求解条件时,就“回溯”返回,尝试别的路径.之前介绍的基础算法中的贪婪算法,动态规划等都具有“无后效性”,也就是在分段处理问题时,某状态一旦确定,将不再改变.而多数问题很难找到"无后效性”的阶段划分和相应决策,而是通过深入搜索尝试和回溯操作完成的. 八皇后问题:8*8的国际象棋棋盘中放八个皇后,是任意两个皇后不能互相吃掉.规则:皇后能吃掉同一行,同一列,同一对角线的任意棋子. 模型建立:不妨设八个

回溯算法之素数环

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// <ather> /// lihonglin /// </ather> /// <content> /// 把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. ///分析:用回溯算法,考察所有

计科1111-1114班第一次实验作业(NPC问题——回溯算法、聚类分析)

实验课安排 地点: 科技楼423 时间:  计科3-4班---15周周一上午.周二下午 计科1-2班---15周周一下午.周二晚上(晚上时间从18:30-21:10) 请各班学委在实验课前飞信通知大家. 实验内容 (1)八皇后及N皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一行.同一列或同一斜线上.问有多少种摆法. 高斯觉得有76种方案.1

DFS ( 深度优先/回溯算法 ) 一

    深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点.整个进程反复进行直到所有节点都被访问为止.属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n).(Wiki) DFS在搜索过程常常伴随许多优化策略,增加剪枝函数,或者和动态规划结合. 让我们用一道看似简单的例子理解DFS. = = /

c语言数据结构:递归的替代-------回溯算法

1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未执行的操作. 2.贴代码表现: 先序遍历二叉树: BTNode *FindNode(BTNode *b,ElementType x) { //在二叉树中查找值为x的结点 BTNode *p; if (b==NULL) return NULL; else if (b->Element==x) retu