Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 给定一些小数字和大数字,生成所需的数字-无循环_Python - Fatal编程技术网

Python 给定一些小数字和大数字,生成所需的数字-无循环

Python 给定一些小数字和大数字,生成所需的数字-无循环,python,Python,我正在用Python解决上的编码问题。问题定义为: 我们想做一排几英寸长的砖。我们有一个号码 小砖块(每个1英寸)和大砖块 砖(每个5英寸)。如果为,则返回True 有可能通过以下方式实现目标: 从给定的砖块中选择。这 比它看起来和看起来要难一点 无需任何循环即可完成 我提出的第一个解决方案是: from itertools import permutations def make_bricks(small, big, goal): l = small*[1]+big*[5]

我正在用Python解决上的编码问题。问题定义为:

我们想做一排几英寸长的砖。我们有一个号码 小砖块(每个1英寸)和大砖块 砖(每个5英寸)。如果为,则返回True 有可能通过以下方式实现目标: 从给定的砖块中选择。这 比它看起来和看起来要难一点 无需任何循环即可完成

我提出的第一个解决方案是:

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