在给定的python集合中,找出一个数是否可能是两个或更多个数的和

2024-04-26 18:00:30 发布

您现在位置:Python中文网/ 问答频道 /正文

你最喜欢的笔有8种,你最喜欢的笔有5种。因此,举例来说,可以购买整整13支钢笔(其中一支5支,第二支8支),但不可能正好买11支,因为5支、8支和24支的非负整数组合加起来等于11支。要确定是否可以购买n支钢笔,必须找到a、b和c的非负整数值,以便

5a+8b+24c=n

编写一个名为numPens的函数,它接受一个参数n,如果可以购买5、8和24包单位的组合,使笔的总数正好等于n,则返回True,否则返回False。在

注:这是上个月在学期中考试中出现的一个问题。我无法解决它,但仍在寻找解决办法。任何帮助都会被接受的。python中的代码或解决它的算法。谢谢


Tags: 函数代码算法falsetrue参数单位整数
1条回答
网友
1楼 · 发布于 2024-04-26 18:00:30

这听起来是dynamic programming的一个很好的候选者。在

def numPens(n):
  pen_sizes = [5, 8, 24]
  results = [True]
  for i in range(1, n+1):
    results.append(any(i >= size and results[i - size] for size in pen_sizes))
  return results[n]

这里的主要见解是:

  1. 可获得0支钢笔(一般:每种尺寸0包)。在
  2. 如果我们知道少于n支笔的答案,我们就可以知道是否能得到n支笔。在

例如,假设我们已经知道0到9的答案,我们想知道是否能得到10支笔。好吧,我们至少需要一包。然后有3种情况需要考虑:

  1. 一包5+但是我们有5支钢笔,如果有可能的话。在
  2. 一包8+但是我们有2支钢笔,如果可能的话。在
  3. 一包24+但是我们得到-14支笔,如果可能的话得到-14支笔。在

最后一个是没有意义的,所以得到10支钢笔是可能的,如果(并且仅当)有可能得到5支钢笔或2支钢笔。因为我们假设我们已经知道0到9的答案,所以我们可以解决这个问题(结果是5支钢笔是可能的,作为一包5支,所以我们得出结论,10支也是可能的)。在

所以为了让我们自己处于这样一种情况,我们总是有n的较小值的答案,我们从0的明显答案开始。然后我们计算1的答案(因为我们已经有了0的答案,我们可以这样做)。然后我们计算2的答案(因为我们已经有了0和1,我们可以这样做),以此类推,直到我们得到我们想要的n的答案。在

这段代码封装了先前结果的实际计算结果:如果有任何包大小size,那么它将生成True,而购买这样大小的包是有意义的(没有得到i - size的负数),而且我们之前也有过 找到了买i - size笔的方法。在

^{pr2}$

剩下的代码让我们将结果存储在results列表中以备将来使用,并最终返回最终结果。在

相关问题 更多 >