## Syamantak 2 years ago Write a function, called numPens that takes one argument, n, and returns True if it is possible to buy a combination of 5, 8 and 24 pack unit in Python.

1. Lyrae

How much python do you know? Do you know how to make a function? Do you have any code?

2. Syamantak

Yes I know how to make a function.

3. Syamantak

This is the exact question def numPens(n): """ n is a non-negative integer Returns True if some non-negative integer combination of 5, 8 and 24 equals n Otherwise returns False. """

4. Lyrae

@Syamantak Are you still there?

5. Syamantak

Yes

6. Lyrae

I think i might have a solution, but I to be honest with you I have more experience with Java, so i might not be the most optimal one.

7. Syamantak

Sorry the solution is not right , but nevertheless Thank You !

8. Lyrae

Do you have some kind of answer to compare against?

9. Syamantak

No there is no answer to compare against

10. Lyrae

Do we have to use all three of them or could we use combinations with only one or two of the diffrent packsizes? for example: n = 15 => 3*5 pack

11. Syamantak

We could use combination of any one any two or all three , we could also take a number twice and a number once

12. Syamantak

for example a=5,b=8 and c=24 and n can be anything.It must be done like a+b or 2(A+B) OR A+B+C

13. msmithhnova

This is basically a variation of the old McNugget Problem. I am sure you can find lots on this on google. Here is a link to some related math, hope it helps http://www.mathnerds.com/best/mcnuggets/index.aspx

14. msmithhnova

And here is McNuggets in Python, found on google. def McNuggets(n): if n == 0: return True for i in (6, 9, 20): if n >= i and McNuggets(n - i): return True return False

15. msmithhnova

Slight adaption of my other post for fun. def McNuggets(sizes,n): if n == 0: return True for i in (sizes): if n >= i and McNuggets(sizes,n - i): return True return False for i in range(50): print(i,McNuggets((6,9,20),i)) for i in range(50): print(i,McNuggets((5,8,24),i))

16. msmithhnova

Lyrae, the only difference in output between the two seems to be at 0, mine shows True and yours shows False. Not sure which would be considered more accurate.

17. Lyrae

It's probably yours, mine seem to fail at higer values(?) And also, recursive functions are awesome ;)

18. Lyrae

Thinking about it, is 0 even considered a possitive integer(?)

19. msmithhnova

I would think no. Something interesting about the second function I posted is you can send it any set of sizes like below with 4 sizes without changing the function.. for i in range(50): print(i,McNuggets((6,9,25,31),i))

20. Lyrae

Here're 3 different implementations of the same problem and they all preform equal. Like @msmithhnova said it's probably a slight modification on the McNuggets Problem. def numPens(n): i = 0 while i <= n: j = i; while j <= n: k = j while k <= n: if k == n: return True k += 24 j += 8 i += 5 return False def numPens(n): if n == 0: return True for i in (5, 8, 24): if n >= i and numPens(n - i): return True return False def numPens(n): if n == 0: return True elif n < 0: return False elif numPens(n - 24) or numPens(n - 8) or numPens(n - 5): return True else: return False