算法第五章小结

一、回溯算法的概念以及理解

  概念:回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。

  理解:在回溯法中,每次扩大当前部分解时,都面临一个可选的状态集合,新的部分解就通过在该集合中选择构造而成。这样的状态集合,其结构是一棵多叉树,每个树结点代表一个可能的部分解,它的儿子是在它的基础上生成的其他部分解。树根为初始状态,这样的状态集合称为状态空间树。

二、“子集和”问题的解空间结构和约束函数

  1、解空间结构

  非负非零的整数集合 S = {x1, x2, …, xn} 对应的一个子集 S1,S1 中的元素之和为 c 。

    2、约束函数

  if (sum + temp[t] <= c)

   sum 是当前没有加上遍历到的那个值的总和,temp 数组是遍历的,c 是所要求的最优解(就是最大和)。

    如果大于该数,则舍去那个结点

   3.源代码

  

 1 #include <iostream>
 2 using namespace std;
 3 int n, c, d = 0, f = 0, k = 0;
 4 int a[10000], b[10000], e[10000],add[10000];
 5
 6 void backtrack(int i)
 7 {
 8 if (i > n || f == 1) return;
 9 d += a[i];
10 b[i] = 1;
11 if (d != c)
12 {
13 if (d < c && (c - d < add[i])) backtrack(i + 1);
14 d -= a[i];
15 b[i] = 0;
16 backtrack(i + 1);
17 }
18 else
19 {
20 f = 1;
21 for (int j = 1; j <= i; j++)
22 if (b[j] == 1 && a[j] != 0) e[k++] = a[j];
23 }
24 }
25
26 int main()
27 {
28 cin >> n >> c;
29 for (int i = 1; i <= n; i++)
30 cin >> a[i];
31 for (int j = n - 1; j >= 0; j--)
32 add[j] = add[j + 1] + a[j];
33 backtrack(1);
34 if (f == 0) cout << "No Solution!";
35 else
36 {
37 for (int i = 0; i < k; i++)
38 {
39 cout << e[i] << ‘ ‘;
40 }
41 }
42 system("pause");
43 return 0;
44 }

三、本章遇到的问题和结对编程的情况

1、遇到的问题

大概是上机实践的时候,对着第一题0-1背包一直在死磕,然后因为想不出怎样更好得约束函数,一直超时卡着,导致一道题没打出来。就觉得很难受吧!

2、结对编程的情况

两人一学期的编程思想交流,学到了挺多,毕竟不同人思维不同。然后大作业的也互相配合,分工合作才写出来的。

原文地址:https://www.cnblogs.com/zz010/p/12070895.html

时间: 2024-10-30 02:31:55

算法第五章小结的相关文章

[Java Concurrency in Practice]二至五章小结

下面这个"并发技巧清单"列举了在第一部分(二至五章)中介绍的主要概念和规则. 可变状态是至关重要的(It's the mutable state,stupid). 所有的并发问题都可以归结为如何协调对并发状态的访问.可变状态越少,就越容易确保线程安全性. 尽量将域声明为final类型,除非需要它们是可变的. 不可变对象一定是线程安全的. 不可变对象能极大地降低并发编程的复杂性.它们更为简单而且安全,可以任意共享而无须使用加锁或保护性复制等机制. 封装有助于管理复杂性. 在编写线程安全的

DS|数据结构||第五章小结

本章主要学习了树和二叉树相关知识,包括二叉树的性质和存储结构(双亲表示法.孩子表示法.孩子兄弟法),二叉树的前.中.后序遍历算法等,还了解了哈夫曼树和哈夫曼编码的构造方法,以及森林与二叉树之间的相互转换方法. 实验课老师带领我们做了“深入虎穴”这道题: 7-2 深入虎穴 (30 分) 著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…

11.5 第十五章小结

这一章的主题主要是函数程序的重构,我们已经看到了大量的示例和概念.我们首先讨论了在数学意义上的重构,可以发现,在数学意义上,很容易推导出"代码",因此,可以看到特定的改变在何时是正确的.由于其根源在数学中,因此,函数式编程通常也有这样的属性. 我们首先探讨了使用函数类型,能够减少代码重复,这是重构的简单情况:然后发现,使用函数式编程,能够方便跟踪代码中的相关性,因此,我们可以看到特定的重构是否是正确的. 接下来,我们重点关注使用 xUnit.net 进行函数式编程的单元测试.学会组合单

算法第五章上机实践报告

一 . 实践题目 7-2 工作分配问题 二 . 问题描述 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 3 10 2 3 2 3 4 3 4 5 输出样例: 9 三 . 算法描述 1. 解空间 第一个人选择第几个工作,第

算法第五章 | 回溯算法

一. 回溯算法 回溯法有"通用的解题法"之称.可以系统地搜索一个问题的所有解或任一解,是一个既带有系统性又带有跳跃性的搜索算法. 它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树.算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯.否则,进入该子树,继续按深度优先策略搜索.回溯法求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束.回溯法求问题的一个解时,只要搜索到问题的一个解

算法第五章实践

一 . 实践题目 工作分配问题 二 . 问题描述 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 3 10 2 3 2 3 4 3 4 5 输出样例: 9 三 .算法描述 进行回溯,遍历左子树后回溯遍历右子树 if(cp+

算法第五章上机实践

实践题目 工作分配问题 问题描述 有n个人.n个工作,每个人只能做一个工作,每人对应每个工作有一个消费,求完成所有工作的最小消费 算法描述 这里采用回溯法,按顺序给每个人分配工作,如果一件工作已经被分配,打上标记防止被重复分配 分配过程中,如果当前的消费已经大于等于已知的最小消费,就停止对子节点的搜索. 心得体会 实际上这题还有优化空间和另外的解法. 可以用课本的方法通过排列组合来剪枝. 了解到的另外两种解法(本质上一样): 二分图完全匹配算法(匈牙利算法) 网络流--最小费用流(最小费用流也可

算法第五章实践报告

1. 实践题目 工作分配问题 2. 问题描述 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 在这里给出一组输入.例如: 3 10 2 3 2 3 4 3 4 5 输出样例: 在这里给出相应的输出.例如:   9 3. 算

算法第2章小结

递归与分治策略 递归:直接或间接地调用自身的算法称为递归算法.  用函数自身给出定义的函数称为递归函数. [例1]Fibonacci数列 int fibonacci (int n){ if (n <= 1 ) return 1; return fibonacci (n - 1) + fibonacci(n - 2); } [例2]Hanoi塔问题 void hanoi(int n, int a, int b, int c ){ if(n > 0){ hanoi(n - 1, a, c, b);