算法设计
‘壹’ 简单算法设计
先排序(许多排序算法),一般排序算法(如快速排序、堆排序、归并排序)时间复杂度都为nlog(n),
再比较两相邻数即可复杂度为n, o(n) + o(nlog(n)) = o(nlog(n))
即时间复杂度为 o(nlog(n))
‘贰’ 算法设计方法的介绍
《算法设计方法》一书介绍了算法描述和算法分析的基本方法,详细介绍了各种典型算法的基本设计思路。算法是计算机科学的核心内容之一,也是应用电子计算机求解实际问题的基础。对复杂的实际应用问题的求解,大多都归结为算法的设计,然后把求解算法转化为计算机程序。
‘叁’ 算法设计
按你的意思,每一种商品都有{1,2,3,4,5}这5种重要度吗?
如果是,就好办了。
此时,MAX=(P1+P2+……+Pm)*5,算法的意义就在求MAX1=P1+P2+……+Pm
1、先将商品按价格排序(比如从小到大);
2、Pz=N-Pmin (N为当前持有的钱数也可理解为之前买过商品后剩余的钱 数;Pmin为商品中最低的价格;Pz只是个中间变量。)
3、以Pz作为价格上限,去购买商品中价格最高的商品。
(剩余的钱数为N)
4、重复第2到3步,直到第3步条件不满足,则进行第5步。
5、假如第3步中Pz<Pmin,则直接拿N去购买商品中价格最大的商品。
等等,我这算法还不够严谨,没有考虑重复商品的情况。
考虑重复商品的情况要改第2步,这里不能简单的用(N-Pmin)了。先将这里的Pmin改为Pm吧,这个Pm要重新计算。
计算Pm的步骤:
1、将N/2,取整数部分。
2、在商品价格中从低价向上累加,得到一个<=第1步的整数部分的最大值为Pm
新的算法:
1、先将商品按价格排序(比如从小到大);
2、计算Pm,将此时的Pm保存下来Pn=Pm。
3、Pz=N-Pm (N为当前持有的钱数也可理解为之前买过商品后剩余的钱数;Pz只是个中间变量。)
4、以Pz作为价格上限,去购买商品中价格最高的商品。
(剩余的钱数为N;需要把已购买的那个商品从数组中删除。)
5、计算新的Pm (经过多次重复后,Pm将为0)
6、重复第3到5步直到Pz<剩余商品的最低价格。得到一个MAX值。
7、再计算Pm,这时计算方法有点改变,用Pn/2。再把Pm保存下来Pn=Pm
8、重复第3到7步直到Pn为0
9、将各个MAX值进行比较,找出最大值。
如果商品的重要度是1到5的部分或全部,还没想出来。
‘肆’ 算法指什么,算法设计有什么指标
通俗讲就是解决问题的方法,用到计算机里,一般指程序设计中用到算法比较多。也是考研的时候计算机系的一个重点。
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。
一个算法应该具有以下五个重要的特征:
有穷性: 一个算法必须保证执行有限步之后结束;
确切性: 算法的每一步骤必须有确切的定义;
输入:一个算法有0个或多个输入,以刻画运算对象的初始情况;
输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
http://www.cqzxzx.cn/it/noi/shuanfa/001.htm
‘伍’ 算法设计怎么样
虽然翻译有些糟糕,很多句子要读好几遍才能理解(并不是因为意思多么复杂),但依然体现了原着在内容结构上优秀的编排。这本书比较适合我,书中的每一个问题,都能体......
‘陆’ 如何设计算法
设计一个正确的算法是一件困难的工作,因为它需要创新,从以太真空中发掘出一个解方案来解决问题。算法设计比对现有的方案进行改良要难得多,因为算法设计的可选择空间太,过多的自由反而成了一种约束。 This book is designed to make you a better algorithm designer. The techniques presented in Part I of this book provide the basic ideas underlying all combinatorial algorithms. The problem catalog of Part II will help you with modeling your application and point you in the right direction of an algorithm or implementation. However, being a successful algorithm designer requires more than book knowledge; it requires a certain attitude, the right problem-solving approach. It is difficult to teach this mindset in a book; yet getting it is essential to become a successful designer. 本书的设计目标是让你成为一个更好的算法设计者。本书第一部分展示有关组合算法的基本原理和基本思想;第二部分的问题清单帮助你为你的问题建模,并且为你指明实现正确算法的方向。尽管如此,要成为一个成功的算法设计者光有书本知识是不够的,面对问题的态度(attitude)和选择正确的方法更重要。书本容易传授知识,很难传授人的心态(mindset)和思考方式;而这种心态和思考却是成为成功的算法设计者的根本条件。 The key to algorithm design (or any other problem-solving task) is to proceed by asking yourself a sequence of questions to guide your thought process. What if we do this? What if we do that? Should you get stuck on the problem, the best thing to do is move onto the next question. In any group brainstorming session, the most useful person in the room is the one who keeps asking, ``Why can't we do it this way?'' not the person who later tells them why. Because eventually she will stumble on an approach that can't be shot down. 算法设计(或其它问题解决任务)的关键是一系列持续的自我反问,这些反问引导我们思维的前进。“如果这样做会怎样?”,“如果那样做又会怎样?”……如果 你被一个问题掐住了,最好的办法就是先搁一下,换一个问题换一个前进的方向试试。在每组头脑风暴会议中,最有价值的人是不断提出为什么的人,不是尔后解说为什么的人。因为我们常常被一些习以为常的东西所拌倒,掉进自己设置的陷阱。 kemin:如果问题解决是一种思考过程,那么思考的形式(过程的严谨性、细致性和正确性)很重要,而思考的内容也不容忽视。因为引导我们思考前进的方式 除反问本身外,反问的内容也很重。就比如参加头脑风暴的材料一样。人大脑的思维功能是硬编码的,人与人之间没有思维规律——质的区别,只是思维的清晰度和 灵敏度——量的差别。人与人之间智力的差别更多体现在思维内容的量上,体现在对外部世界的事实掌握的广度和深度上。 Towards this end, we provide below a sequence of questions to guide your search for the right algorithm for your problem. To use it effectively, you must not only ask the questions, but answer them. The key is working through the answers carefully, by writing them down in a log. The correct answer to, ``Can I do it this way?'' is never ``no,'' but ``no, because ....'' By clearly articulating(明确有力地表达) your reasoning as to why something doesn't work, you can check if it really holds up or whether you have just glossed(掩盖) over a possibility that you didn't want to think hard enough about. You will be surprised how often the reason you can't find a convincing(使人信服的) explanation for something is because your conclusion is wrong. 在末尾我们提供一个反问问题的列表,你不但要反问自己这些问题,更重要是仔细回答这些问题,最好把答案写下来。回答诸如问题“我可以使用这种方式吗?”的 不是一个“不能”就完了,而是“不能,因为……”。通过仔细明确的回答“为什么不能”时,你会发现到底是“真的不能“,还是只是你自己不愿意去深入思考掩 盖了”能“。如果你不曾训练出严谨的思考方式,当你这样做时你会惊讶的发现,为了说明某些东西但却找不到一个令人信服的解释的原因常常是因为你的结论本身 是错的。 An important distinction to keep aware of ring any design process is the difference between strategy and tactics(战略). Strategy represents the quest for the big picture, the framework around which we construct our path to the goal. Tactics are used to win the minor battles we must fight along the way. In problem solving, it is important to check repeatedly whether you are thinking on the right level. If you do not have a global strategy of how you are going to attack your problem, it is pointless to worry about the tactics. 在设计过程中特别重要区分策略和战略的概念。策略是对全局的一个探索,一个构筑通向目标路径的指导框架。战略则是用来解决通向大目标过程的较小的问题。如果你对关于如何对付所面临的问题没有一个全局的策略,那关心战略是不得要领的,予事无补的。在解题领域,不断修正思维的层次(thinking on the right level)是很重要战略。(--莱布尼兹曾经将人的解题思考过程比喻成晃筛子,把脑袋里面的东西都给抖落出来,然后正在搜索的注意力会抓住一切细微的、与问题有关的东西。事实上,要做到能够令注意力抓住这些有关的东西,就必须时刻将问题放在注意力层面,否则即使关键的东西抖落出来了也可能没注意到。) An example of a strategic question is, ``How best can I model my application as a graph algorithm problem?'' A tactical question might be, ``Should I use an adjacency邻接 list or adjacency matrix data structure to represent my graph?'' Of course, such tactical decisions are critical to the ultimate quality of the solution, but they can be properly evaluated only in light of a successful strategy. 一个策略问题的例子是:“我如何才能更好地把我的问题建模成图问题?”。而一个战略问题可能是这样:“我是用邻接列表还是邻接矩阵来实现我的图结构?”。当然,这种战略选择是对解决方案的最终质量起着重要作用;不过战略价值的体现还是基于正确的策略的选择。 When faced with a design problem, too many people freeze up in their thinking. After reading or hearing the problem, they sit down and realize that they don't know what to do next. They stare(凝视) into space, then panic(惊惶), and finally end up settling(沉淀; 决定) for the first thing that comes to mind. Avoid this fate(天数; 运气; 命运 ). Follow the sequence of questions provided below and in most of the catalog problem sections. We'll tell you what to do next! 初学者在面对问题时常常表现出思维凝滞、手足无措和盲目解题。参考以下的反问问题列表和本书的问题清单,我们告诉你应该怎么做。 Obviously, the more experience you have with algorithm design techniques such as dynamic programming, graph algorithms, intractability, and data structures, the more successful you will be at working through the list of questions. Part I of this book has been designed to strengthen this technical background. However, it pays to work through these questions regardless of how strong your technical skills are. The earliest and most important questions on the list focus on obtaining a detailed understanding of the problem and do not require specific expertise. 当然本反问问题列表对读者有背景要求,要求读者对算法设计技术(动态规划、图算法、难解性和数据结构)的熟悉程度。本书第一部分的目标就是对这些技术背景进行强化。不过,不管你的技术背景怎样,通读这些问题对你解题还是很有裨益的。
‘柒’ c语言算法设计
这里都没说abcd为整数,解都是无穷多的,还多少组,组得完么,
题目得再限定各个量都为整数,才有可能去举一举,
跟算法没关体系,只是数学题,没意思
‘捌’ 算法设计有哪些方法
算法设计常用的几种方法是
1. 穷举法
2. 贪心法
3. 分治法
4. 回溯法
5. 分枝限界法
6. 动态规划法
‘玖’ 算法设计题
(再版)
0-1背包问题
0-1背包问题:给定n种物品和一个背包。项目我的体重是无线网络,它的价格是vi背包容量C.
Q:我应该如何选择装载物品的背包,使得装入背包的总价值呢?
选择项目装入背包的每个项目我只有两种选择,即装入背包或不装入背包。项目i装入背包多次,不仅加载的项目我。
因此,这个问题被称为0-1背包问题。
?0-1解向量(X1,X2,...,XN),西安∈{0,1},1 <= I <= N。
动态编程解决方案:
集0-1背包问题给定的子最优值,M(I,J),M(我,j)是第j背包容量,可选择的项目我,我+1,...,N 0-1背包问题的最优值
无效背包()
INT I,J;
为(i = 0; I <=我+ +)
为(J = 0 J <= JMAX; J + +)
M [] [J] = 0;
(i = 0; <= n; i + + )
为(J = 0; <= JMAX; J + +)
(W [I]> J)
米[I] [J] = M [I-1] [J];
其他
M [] [J] = MAX(M [I-1] [J],M [I-1] [JW [我] + V [I]);
printf的(“%d \ N”,M [N] [C]); BR />
}
回溯解决方案:
无效1背包(I)
{
BR />(>),百视通= CV
其他
{
(CW + W [I] <= C )
{
CW + = W [我];
CV + = V [I];
背包(i +1);
CW-= W [I];
CV-= V [I];
}
a>
背包(+1);
}
}