你最喜欢的笔有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中的代码或解决它的算法。谢谢
这听起来是dynamic programming的一个很好的候选者。在
这里的主要见解是:
例如,假设我们已经知道0到9的答案,我们想知道是否能得到10支笔。好吧,我们至少需要一包。然后有3种情况需要考虑:
最后一个是没有意义的,所以得到10支钢笔是可能的,如果(并且仅当)有可能得到5支钢笔或2支钢笔。因为我们假设我们已经知道0到9的答案,所以我们可以解决这个问题(结果是5支钢笔是可能的,作为一包5支,所以我们得出结论,10支也是可能的)。在
所以为了让我们自己处于这样一种情况,我们总是有n的较小值的答案,我们从0的明显答案开始。然后我们计算1的答案(因为我们已经有了0的答案,我们可以这样做)。然后我们计算2的答案(因为我们已经有了0和1,我们可以这样做),以此类推,直到我们得到我们想要的n的答案。在
这段代码封装了先前结果的实际计算结果:如果有任何包大小
^{pr2}$size
,那么它将生成True
,而购买这样大小的包是有意义的(没有得到i - size
的负数),而且我们之前也有过 找到了买i - size
笔的方法。在剩下的代码让我们将结果存储在
results
列表中以备将来使用,并最终返回最终结果。在相关问题 更多 >
编程相关推荐