Python 给定一些小数字和大数字,生成所需的数字-无循环
我正在用Python解决上的编码问题。问题定义为: 我们想做一排几英寸长的砖。我们有一个号码 小砖块(每个1英寸)和大砖块 砖(每个5英寸)。如果为,则返回True 有可能通过以下方式实现目标: 从给定的砖块中选择。这 比它看起来和看起来要难一点 无需任何循环即可完成 我提出的第一个解决方案是:Python 给定一些小数字和大数字,生成所需的数字-无循环,python,Python,我正在用Python解决上的编码问题。问题定义为: 我们想做一排几英寸长的砖。我们有一个号码 小砖块(每个1英寸)和大砖块 砖(每个5英寸)。如果为,则返回True 有可能通过以下方式实现目标: 从给定的砖块中选择。这 比它看起来和看起来要难一点 无需任何循环即可完成 我提出的第一个解决方案是: from itertools import permutations def make_bricks(small, big, goal): l = small*[1]+big*[5]
from itertools import permutations
def make_bricks(small, big, goal):
l = small*[1]+big*[5]
return any([(goal in i) for i in ([[sum(j) for j in set(permutations(l,i))] \
for i in range(2,len(l)+1)])])
这是正确的,但被评判软件拒绝,因为不允许进口。
因此,我的下一个解决方案是:
def make_bricks(small, big, goal):
bricks = small*[1]+big*[5]
for step in range(len(bricks)+1,1,-1):
for start in range(len(bricks)):
if len(bricks[start:start+step])==step:
if sum(bricks[start:start+step])==goal:
return True
return False
这也是正确的,但由于输入超时,如make_bricks(1000000、1000、1000100)
那么,如何在Python中解决这个问题,而不使用导入、不使用循环和在时间限制内?这是一个数学问题。假设您有
S
小砖块和B
大砖块,并且您想要一个长度L
块
您可以使用K=min(B,L div 5)
大砖块和L-5K
小砖块,因此您只需检查是否有足够的小砖块
div
是整数除法(floor)
编辑将
L-K
更改为L-5K
。打字错误。这是一道数学题。假设您有S
小砖块和B
大砖块,并且您想要一个长度L
块
您可以使用K=min(B,L div 5)
大砖块和L-5K
小砖块,因此您只需检查是否有足够的小砖块
div
是整数除法(floor)
编辑将
L-K
更改为L-5K
。打字错误。请记住,您只需达到最终尺寸即可。因此,砖块的摆放顺序根本不重要
下一个重要的想法是尽可能使用5英寸的砖。若你们使用其中一块砖,你们可以覆盖5英寸,若你们使用5块1英寸的砖。因此,最好只使用一块砖
现在,您已经真正完成了:检查您可以使用给定的5英寸砖块创建的最大长度,直到您的5英寸砖块用完或者您的目标长度缺少不到5英寸为止。无论哪种方式,都会缺少一些距离,您必须用剩余的1英寸砖块填充这些距离
我不会在这里给出任何代码,因为这确实是一个非常简单的问题,根据您上面所写的内容,您应该能够轻松地解决它,一旦您了解了如何解决它。请记住,您只需达到最终大小即可。因此,砖块的摆放顺序根本不重要 下一个重要的想法是尽可能使用5英寸的砖。若你们使用其中一块砖,你们可以覆盖5英寸,若你们使用5块1英寸的砖。因此,最好只使用一块砖 现在,您已经真正完成了:检查您可以使用给定的5英寸砖块创建的最大长度,直到您的5英寸砖块用完或者您的目标长度缺少不到5英寸为止。无论哪种方式,都会缺少一些距离,您必须用剩余的1英寸砖块填充这些距离
我不会在这里给出任何代码,因为这确实是一个非常简单的问题,根据您上面所写的内容,一旦您了解了如何解决它,您应该能够轻松地解决它。当您有单个单位的项目,并且只有一个较大的项目时,这并不是那么困难,因为您总是可以用较大的项目填充尽可能多的项目 如果你有25美分和10美分的硬币,并试图准确地用它们来赚一笔钱,那么就更难了。例如,如果你必须赚55美分,那么如果你一开始就赚了2个25美分,即使它低于目标,你也会失败 当然,你可能会有其他组合,这会使问题比“不要接近数量——你拥有的最小单位”更复杂 如果你解同余方程(Ax+By)%AB=C,你总是可以用A(x+B)+B(y-A)得到更多的方程,这也等于C,这样你就可以绕过你的砖块/硬币或其他东西的有限数量 同余方程的一个例子是(7x+9y)%63=47,您可以编写一个函数来求解这些方程。我们分解为最低项,所以假设A和B是共质数,或者用HCF来减少它 有一个x=0的唯一解决方案。在这种情况下,我们将得到x=8,y=6,每一个都在其最大值56+54=110处,这与47 mod 63是一致的,因此如果目标实际上是47,它就不能用任何数量的7和9来解 如果目标是110,那么如果我们有8块7砖和6块9砖,就可以解决这个问题。否则就没有解决办法 如果目标更高,将有多个解决方案具有无限的砖块,但我们需要的9个砖块的数量将始终为8 mod 9,因此将为8、17、26等。我们选择适合此类别的最高数量,并尝试用7个砖块填充其余部分。如果我们有他们,我们就能达到我们的目标。如果我们有33块9块砖,我们必须使用其中的26块
一旦你解决了一致性问题,这就是你的算法。当你有一个单位项目,只有一个较大的项目时,就不那么困难了,因为你总是可以用较大的项目尽可能多地填充 如果你有25美分和10美分的硬币,并试图准确地用它们来赚一笔钱,那么就更难了。例如,如果你必须赚55美分,那么如果你一开始就赚了2个25美分,即使它低于目标,你也会失败 当然,你可能会有其他组合,这会使问题比“不要接近数量——你拥有的最小单位”更复杂 如果你解同余方程(Ax+By)%AB=C,你总是可以用A(x+B)+B(y-A)得到更多的方程,A(x+B)+B(y-A)也等于C,这样你就可以绕过你的砖块/硬币或硬币的有限数量
def make_bricks(small, big, goal):
bricks = small*[1]+big*[5]
for step in range(len(bricks)+1,1,-1):
for start in range(len(bricks)):
if len(bricks[start:start+step])==step:
if sum(bricks[start:start+step])==goal:
return True
return False
def make_bricks(small, big, goal):
# minimum number of 1s needed
rem = goal % 5 # ex: 19 % 5 == 4
if rem > small:
# too few 1s
return false
else:
# we have enough 1s; deduct what we just used
small -= rem
goal -= rem
# now see if what's left will fill the rest of the hole
return small + 5*big >= goal
def make_bricks(small, big, goal):
if goal > small + big * 5:
return False
else:
return goal % 5 <= small
def make_bricks(s,b,g):
return not(g>b*5+s or g%5>s)
def make_bricks(small, big, goal):
if int(goal/5) < big:
big -= big - int(goal/5)
return big*5 + small >= goal
def make_bricks(small, big, goal):
qu = goal/5
rem = goal%5
if big*5 <= goal and big*5 +small>= goal:
return True
else:
return qu <= big and rem <= small