Autor Tema: Subset sum solucion polinomial

0 Usuarios y 1 Visitante están viendo este tema.

09 Noviembre, 2026, 12:30 am
Leído 74 veces

amartinez---FDasf

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: uy
  • Karma: +0/-0

09 Noviembre, 2026, 02:12 am
Respuesta #1

amartinez---FDasf

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: uy
  • Karma: +0/-0
Aqui las bases

09 Noviembre, 2026, 09:52 pm
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Tu propuesta


Spoiler
Código: [Seleccionar]

import math
import random


def solucionS(maximo, n, V):
    if n == 2:
        if V[2][1]+V[1][1]== maximo:
            return [V[2][0], V[1][0]]
        else:
            return [V[2][0], V[1][0], V[0][0]]
    else:
        if V[n][1] + V[2][1] + V[1][1] > maximo:
            return solucionS(maximo, n-1, V)
        else:
            return [V[n][0]] + solucionS(maximo - V[n][1], n-1, V)
   
def solucionQ(maximo, n, V):
    if n == 2:
        if V[2][1] == maximo:
            return [V[2][0]]
        else:
            return [V[2][0],V[0][0]]
    else:
        if V[n][1] + V[2][1] > maximo:
            return solucionQ(maximo, n-1, V)
        else:
            return [V[n][0]] + solucionQ(maximo - V[n][1], n-1, V)
   


def solucionP(maximo, n, V):
    if n == 2:
        if V[1][1] == maximo:
            return [V[1][0]]
        else:
            return [V[1][0], V[0][0]]
    else:
        if V[n][1] + V[1][1] > maximo:
            return solucionP(maximo, n-1, V)
        else:
            return [V[n][0]] + solucionP(maximo - V[n][1], n-1, V)
   


def solucionO(maximo, n, V):
    if n == 2:
        if V[0][1] == maximo:
            return [V[0][0]]
        else:
            return []
    else:
        if V[n][1] > maximo:
            return solucionO(maximo, n-1, V)
        else:
            return [V[n][0]] + solucionO(maximo - V[n][1], n-1, V)
   


def numero_a_lista_fija(numero, bits_usados):
    l = [int(bit) for bit in f"{numero:b}"]
    l.reverse()
    return l


def obtener_suma_con_letras(tabla, letras):
    suma = 0
    i = 0
    while i < len(tabla):
        for l in letras:
            if tabla[i][0] == l:
                suma += tabla[i][1]
        i = i + 1
    return suma


def obtener_suma(tabla, pertenece):
    suma = 0
    for i in range(len(pertenece)):
        if pertenece[i] == 1:
            suma += tabla[len(tabla)-i-1][1]
    return suma


def obtener_letras(tabla, pertenece):
    L = []
    for i in range(len(pertenece)):
        if pertenece[i] == 1:
            L.append(tabla[len(tabla)-i-1][0])
    return L




def obtener_suma_de_valores_aleatorios(tabla):
    random_i = int(random.uniform(0, 2**len(tabla)))
    pertenece = numero_a_lista_fija(random_i, int(math.floor(2**len(tabla))))
    print("#SECRETO: variable local")
    print("indice", random_i)
    print("pertenece", pertenece.reverse())
    L = obtener_letras(tabla, pertenece)
    suma = obtener_suma(tabla, pertenece)
    print(L)
    print(suma)
    print("#SECRETO")
    return suma


# tenemos la lista de objecos
lista_objetos = [
    ("L", 1542), 
    ("N", 1154), 
    ("T", 20), 
    ("S", 19), 
    ("Q", 17), 
    ("O", 15), 
    ("P", 1),
    ("A", 3), 
    ("B", 4),
    ("E", 5), 
    ("F", 6), 
    ("G", 7), 
    ("H", 8), 
    ("I", 9), 
    ("J", 1011), 
    ("K", 11), 
    ("M", 13), 
    ("R", 168), 
]


#tenemos la lista ordenada de objetos decreciente
lista_objetos = sorted(
    lista_objetos,
    key=lambda x: x[1],
    reverse=False
)


print(lista_objetos)




#obtenemos suma
suma_random = obtener_suma_de_valores_aleatorios(lista_objetos)
# suma_random= 3804


print("==")
print("COMIENZO")
print("==")


O=solucionO(suma_random,len(lista_objetos)-1, lista_objetos)
P=solucionP(suma_random,len(lista_objetos)-1, lista_objetos)
Q=solucionQ(suma_random,len(lista_objetos)-1, lista_objetos)
S=solucionS(suma_random,len(lista_objetos)-1, lista_objetos)


sumaO = obtener_suma_con_letras(lista_objetos, O)
sumaP = obtener_suma_con_letras(lista_objetos, P)
sumaQ = obtener_suma_con_letras(lista_objetos, Q)
sumaS = obtener_suma_con_letras(lista_objetos, S)


if sumaO == suma_random:
    print(O,sumaO)
if sumaP == suma_random:
    print(P,sumaP)
if sumaQ == suma_random:
    print(Q,sumaQ)
if sumaS == suma_random:
    print(S,sumaS)
 
[cerrar]



Veo ahora tu lista de objetos tienes los pesos pero no el valor


antes tenias


lista_objetos = [   

("A", 10, 60),
("B", 20, 100),   
("C", 30, 120),     
("D", 5, 24),     
("E", 5, 24),     
("F", 6, 25),     
("G", 7, 26),     
("H", 8, 28),     
("I", 9, 30),     
("J", 10, 31),     
("K", 11, 32),     
("L", 12, 33),     
("M", 13, 34),     
("N", 14, 35),     
("O", 15, 36),     
("P", 16, 37),     
("Q", 17, 38),     
("R", 18, 39),     
("S", 19, 40),     
("T", 20, 41) 
][/code]
Saludos  \(\mathbb {R}^3\)

10 Noviembre, 2026, 01:43 am
Respuesta #3

amartinez---FDasf

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: uy
  • Karma: +0/-0
Disculpa la confusión he bajado de complejidad al problema a la suma del subconjunto, sigue siendo NP completo pero más sencillo que el knapsack que lo estoy trabajando ahora. Antes estaba con ese pero se me hizo muy grande