Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/12/2011, 13:08
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: [Aporte] Problema de la mochila

Código completo

Código Python:
Ver original
  1. #coding: utf-8
  2.  
  3. class Item:
  4.     def __init__(self, value, weight):
  5.         self.value = value
  6.         self.weight = weight
  7.  
  8.     def __str__(self):
  9.         return "Value: %d - Weight: %d" % (self.value, self.weight)
  10.    
  11.     def __repr__(self):
  12.         return self.__str__()
  13.  
  14. items = [Item(4, 12),
  15.          Item(2, 2),
  16.          Item(2, 1),
  17.          Item(1, 1),
  18.          Item(10, 4),
  19.         ]
  20. c = 0
  21. def ks(index, weight):
  22.     global items
  23.     global c
  24.     c += 1
  25.  
  26.     if index >= len(items):
  27.         return 0
  28.  
  29.     item = items[index]
  30.  
  31.     if item.weight > weight:
  32.         return ks(index + 1, weight)
  33.     else:
  34.         return max(ks(index + 1, weight),
  35.                    ks(index + 1, weight - item.weight) + item.value)
  36.  
  37. print "Max sum: %d" % (ks(0, 20),)
  38. print "Iterations %d" % (c,)
  39. print
  40.  
  41. c = 0
  42. mem = {}
  43. def ks(index, weight):
  44.     global items
  45.     global c
  46.     global mem
  47.     c += 1
  48.  
  49.     case = (index, weight)
  50.     if case in mem:
  51.         return mem[case]
  52.  
  53.  
  54.     if index >= len(items):
  55.         mem[case] = 0
  56.         return mem[case]
  57.  
  58.     item = items[index]
  59.     grab_case = (index + 1, weight - item.weight)
  60.     no_grab_case = (index + 1, weight)
  61.  
  62.     if item.weight > weight:
  63.         mem[case] = ks(*no_grab_case)
  64.         return mem[case]
  65.     else:
  66.         if no_grab_case not in mem:
  67.             mem[no_grab_case] = ks(index + 1, weight)
  68.         if grab_case not in mem:
  69.             mem[grab_case] = ks(index + 1, weight - item.weight) + item.value
  70.         mem[case] = max(mem[grab_case], mem[no_grab_case])
  71.         return mem[case]
  72.  
  73. print "Max sum: %d" % (ks(0, 20),)
  74. print "Iterations %d" % (c,)
  75. print
  76.  
  77. def ks(items, weight):
  78.     mem = [[0 for j in xrange(weight + 1)]
  79.            for i in xrange(len(items) + 1)]
  80.    
  81.     grab = [[0 for j in xrange(weight + 1)]
  82.            for i in xrange(len(items) + 1)]
  83.    
  84.    
  85.     for i, item in enumerate(items, start=1):
  86.         for j in xrange(1, weight + 1):
  87.             if item.weight <= j:
  88.                 if item.value + mem[i][j - item.weight] >= mem[i - 1][j]:
  89.                     mem[i][j] = item.value + mem[i][j - item.weight]
  90.                     grab[i][j] = 1
  91.                 else:
  92.                     mem[i][j] = mem[i - 1][j]
  93.             else:
  94.                 mem[i][j] = mem[i - 1][j]
  95.                
  96.     itemList = []
  97.     n = len(items)
  98.     while n > 0 and weight >= 0:
  99.         if grab[n][weight]:
  100.             itemList.append(items[n-1])
  101.             weight -= items[n-1].weight
  102.         n -= 1
  103.     return itemList
  104.                
  105. print ks(items, 15)