Help with small program

gokkog at yahoo.com gokkog at yahoo.com
Mon Jan 1 08:53:44 EST 2007


"Paul Watson 写道:
"
> Tim Roberts wrote:
> > gokkog at yahoo.com wrote:
> >> Interesting impl in Python! I am wondering what if the requirement is
> >> to find the minimum number of coins which added to the "fin" sum...
> >
> > Given the set of coins in the original problem (100, 10, 5, 1, 0.5), the
> > solution it provides will always be optimal.  Even if we change this to
> > American coinage (50, 25, 10, 5, 1), I believe it is still optimal.
> >
> > It is certainly possible to construct a set of denominations for which the
> > algorithm occasionally chooses badly.  For example, if you give it the set
> > (40,35,10) and ask it to make change for 70, it will be suboptimal.
>
> Tim,
>
> Unless I am missing the point, the minimum number of coins from the set
> available will be chosen.  Surely this homework is past due by now.
>
> $ cat coins.py
> #!/usr/bin/env python
> import sys
>
> cointypes = (100, 10, 5, 1, 0.5)
>
> def coins(fin, cointypes):
>      needed = {}
>      for c in cointypes:
>          v, r = divmod(fin, c)
>          if v > 0:
>              needed[c] = int(v)
>              fin = r
>      return needed
>
> def doit(fin, cointypes = cointypes):
>      h = coins(fin, cointypes)
>      print '%.1f requires %d coins in hash ' % (fin, sum(h.values())), h
>
> if __name__ == '__main__':
>      doit(51)
>      doit(127)
>      doit(12.5)
>      doit(70, (40,35,10))
>
>      sys.exit(0)
>
> $ ./coins.py
> 51.0 requires 6 coins in hash  {1: 1, 10: 5}
> 127.0 requires 6 coins in hash  {1: 2, 10: 2, 100: 1, 5: 1}
> 12.5 requires 4 coins in hash  {0.5: 1, 1: 2, 10: 1}
> 70.0 requires 4 coins in hash  {40: 1, 10: 3}


To be explicit, the min coins question could be resolved with "dynamic
programming". So it is not a pure python question. No, this is not a
homework question. Well, it is somewhat academic:
http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg

I wrote the following Python implementation akin to topcoder algorithm:

#!/usr/bin/env python
default_cointypes = (1, 3, 5)

def mincoins(fin, cointypes = default_cointypes):
    needed = {}
    for c in cointypes:
        needed[c] = 0
    min = {}
    for item in range(1, fin+1):
        min[item] = 2007 # suppose 2007 is the "infinity"
    min[0] = 0

    for i in range(1, fin+1):
        for c in cointypes:
            if (c <= i and min[i-c] + 1 < min[i]):
                min[i] = min[i-c] + 1
                needed[c] += 1

    print fin, "==>",  min[fin]
    print needed

if __name__ == '__main__':
    mincoins(11)

Probably there are things to be improved and there could be the
pythonic way(s): Welcome your comments and ideas!


Happy new year!
Wenjie




More information about the Python-list mailing list