要改进这两种算法,都是一个目标,就是寻找不需要列出所有解的办法来。
前一种算法,是求出所有的可能解,然后再找其中的最优解。要进行优化,则可以将求解与求优合二为一。在每一个递归中,都寻找最优解。比如,make_change(14,[10,7,2]),我们就可以寻找14-10后剩余的4的最优解,得到[2,2],以及14-7后剩余的7的最优解,得到[7],最后是14-2后剩余的12的最优解,得到[10,2]。然后选择其中最短的一个[7],组合为[7,7]作为结果返回。
代码如下:
-
def make_change(amount, coins = [25, 10, 5, 1])
-
return [amount] if coins.include?(amount)
-
min_one_coin=nil
-
min_coins=Array.new(amount)
-
coins.each do |one_coin|
-
if amount-one_coin>0
-
other_coins=make_change(amount-one_coin,coins)
-
if other_coins && min_coins.size>other_coins.size
-
min_one_coin=one_coin
-
min_coins=other_coins
-
end
-
end
-
end
-
min_one_coin ? [min_one_coin]+min_coins : nil
-
end
后一种算法,也可以相当直观的优化,因为整个求解的过程,是由少至多,因此,只要求到第一个满足要求的找零方案,就一定是最优解。
代码如下:
-
def make_change(amount, coins = [25, 10, 5, 1])
-
change_list={}
-
coins.each do |coin|
-
return [amount] if amount==coin
-
change_list[[coin]]=coin
-
end
-
while(true)
-
new_change_list={}
-
coins.each do |coin|
-
change_list.each do |list,v|
-
return list.insert(0,coin).sort if coin+v==amount
-
if v+coin<=amount
-
new_list=list.clone.insert(list.length,coin).sort
-
unless new_change_list[new_list]
-
unless new_change_list.has_value?(v+coin)
-
new_change_list[new_list]=v+coin
-
end
-
end
-
end
-
end
-
end
-
return nil if new_change_list.length==0
-
change_list=new_change_list
-
end
-
end
当然,这两个算法,都还有进一步优化的余地,咱们下回再说。
分享到:
相关推荐
ssd3 practical quiz 3ssd3 practical quiz 3ssd3 practical quiz 3ssd3 practical quiz 3ssd3 practical quiz 3ssd3 practical quiz 3ssd3 practical quiz 3
ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5
【SSD3 Quiz3答案详解】——卡耐基教程精华解析 在计算机科学与信息技术领域,固态存储(Solid State Drive, SSD)是现代数据存储技术的重要组成部分,尤其是在提升系统性能方面发挥着至关重要的作用。卡耐基梅隆...
ssd3 practical quiz 2ssd3 practical quiz 2ssd3 practical quiz 2ssd3 practical quiz 2ssd3 practical quiz 2ssd3 practical quiz 2ssd3 practical quiz 2ssd3 practical quiz 2
ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5ssd3 practical quiz 5
ssd3 practical quiz 8ssd3 practical quiz 8ssd3 practical quiz 8ssd3 practical quiz 8ssd3 practical quiz 8ssd3 practical quiz 8
ssd3 practical quiz 1ssd3 practical quiz 1ssd3 practical quiz 1ssd3 practical quiz 1ssd3 practical quiz 1 ssd3 practical quiz 1
【SSD3-quiz3】是卡耐基梅隆大学在线课程“面向对象程序设计”(Structured System Design 3)的第三次练习题目的答案集。这个练习主要关注面向对象编程的核心概念,包括类的设计、继承、多态以及如何通过UML(统一...
【标题】"ssd3 practical quiz3" 指的是一个关于软件系统开发的实践测试,可能是课程或训练的一部分,特别关注的是第三部分的实践活动。这个标题暗示了这是一个与软件系统设计与发展相关的学习资源,可能涉及到的...
"Practical Quiz 7"可能是一个关于SSD3技术的实践性测验,旨在测试学生或专业人士对这一领域知识的理解和应用能力。下面,我们将深入探讨SSD3相关的知识点: 1. **工作原理**:SSD3的核心是NAND闪存,它由存储单元...
【SSD3 Quiz4 知识点详解】 SSD3,全称为Software System Development 3,是卡耐基梅隆大学面向对象程序设计的一门课程。Quiz 4作为该课程的重要组成部分,旨在检验学生对面向对象编程核心概念的理解,以及在实际...
【标题】"ssd3 practical quiz2"是一个与软件工程相关的实践测验,可能是课程"Software System Development 3"(SSD3)的一部分。这个测验可能涉及了软件开发过程中的实际操作和问题解决,旨在检验学生在项目管理和...
在"ssd3 quiz4答案"中,我们可能讨论以下几个关键知识点: 1. **需求工程**:这是软件开发的起始阶段,包括需求获取、分析、规格化和验证。在Quiz 4中,可能会有与需求文档编写、用例描述或用户故事相关的问题。 2...
【SSD3 Quiz9答案详解】 在卡耐基教程中的SSD3(Structured Systems Design, 第3阶段)Quiz9,我们关注的是系统设计与分析的关键概念。这个阶段的学习旨在提升学员对复杂系统的设计、实现和优化能力。Quiz9可能是对...
SSD3Quiz7是针对固态存储技术(Solid State Drives)的一个学习测验,主要涵盖了SSD的基础知识、工作原理、性能优化以及常见问题等内容。这个资源包含了修正后的答案,旨在帮助学习者检验和巩固他们在SSD领域的理解...
【SSD3 Quiz 6 知识点详解】 在计算机科学领域,SSD3(可能指的是Stanford University的“Structured Systems Design and Modeling”课程的第三学期)是一个涵盖数据结构、算法和系统设计的重要课程。Quiz 6是该...
在这个“Practical Quiz 3”中,我们可以推测学生们被要求展示他们对SSD技术的理解,可能包括其工作原理、性能优化、故障诊断、数据存储等方面的知识。下面我们将深入探讨这些主题,以帮助理解相关的知识点。 1. ...
【标题】"ssd3 practical quiz7答案"涉及的知识点主要与软件开发和编程相关,尤其是Java编程语言。Quiz7可能是一个在线课程或教程的一部分,专注于数据结构和算法的应用,特别是数组列表的操作。 【描述】提到这个...