Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
31
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-1.py
Normal file
31
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-1.py
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
from itertools import combinations
|
||||
|
||||
def anycomb(items):
|
||||
' return combinations of any length from the items '
|
||||
return ( comb
|
||||
for r in range(1, len(items)+1)
|
||||
for comb in combinations(items, r)
|
||||
)
|
||||
|
||||
def totalvalue(comb):
|
||||
' Totalise a particular combination of items'
|
||||
totwt = totval = 0
|
||||
for item, wt, val in comb:
|
||||
totwt += wt
|
||||
totval += val
|
||||
return (totval, -totwt) if totwt <= 400 else (0, 0)
|
||||
|
||||
items = (
|
||||
("map", 9, 150), ("compass", 13, 35), ("water", 153, 200), ("sandwich", 50, 160),
|
||||
("glucose", 15, 60), ("tin", 68, 45), ("banana", 27, 60), ("apple", 39, 40),
|
||||
("cheese", 23, 30), ("beer", 52, 10), ("suntan cream", 11, 70), ("camera", 32, 30),
|
||||
("t-shirt", 24, 15), ("trousers", 48, 10), ("umbrella", 73, 40),
|
||||
("waterproof trousers", 42, 70), ("waterproof overclothes", 43, 75),
|
||||
("note-case", 22, 80), ("sunglasses", 7, 20), ("towel", 18, 12),
|
||||
("socks", 4, 50), ("book", 30, 10),
|
||||
)
|
||||
bagged = max( anycomb(items), key=totalvalue) # max val or min wt if values equal
|
||||
print("Bagged the following items\n " +
|
||||
'\n '.join(sorted(item for item,_,_ in bagged)))
|
||||
val, wt = totalvalue(bagged)
|
||||
print("for a total value of %i and a total weight of %i" % (val, -wt))
|
||||
53
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-2.py
Normal file
53
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-2.py
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
try:
|
||||
xrange
|
||||
except:
|
||||
xrange = range
|
||||
|
||||
def totalvalue(comb):
|
||||
' Totalise a particular combination of items'
|
||||
totwt = totval = 0
|
||||
for item, wt, val in comb:
|
||||
totwt += wt
|
||||
totval += val
|
||||
return (totval, -totwt) if totwt <= 400 else (0, 0)
|
||||
|
||||
items = (
|
||||
("map", 9, 150), ("compass", 13, 35), ("water", 153, 200), ("sandwich", 50, 160),
|
||||
("glucose", 15, 60), ("tin", 68, 45), ("banana", 27, 60), ("apple", 39, 40),
|
||||
("cheese", 23, 30), ("beer", 52, 10), ("suntan cream", 11, 70), ("camera", 32, 30),
|
||||
("t-shirt", 24, 15), ("trousers", 48, 10), ("umbrella", 73, 40),
|
||||
("waterproof trousers", 42, 70), ("waterproof overclothes", 43, 75),
|
||||
("note-case", 22, 80), ("sunglasses", 7, 20), ("towel", 18, 12),
|
||||
("socks", 4, 50), ("book", 30, 10),
|
||||
)
|
||||
|
||||
def knapsack01_dp(items, limit):
|
||||
table = [[0 for w in range(limit + 1)] for j in xrange(len(items) + 1)]
|
||||
|
||||
for j in xrange(1, len(items) + 1):
|
||||
item, wt, val = items[j-1]
|
||||
for w in xrange(1, limit + 1):
|
||||
if wt > w:
|
||||
table[j][w] = table[j-1][w]
|
||||
else:
|
||||
table[j][w] = max(table[j-1][w],
|
||||
table[j-1][w-wt] + val)
|
||||
|
||||
result = []
|
||||
w = limit
|
||||
for j in range(len(items), 0, -1):
|
||||
was_added = table[j][w] != table[j-1][w]
|
||||
|
||||
if was_added:
|
||||
item, wt, val = items[j-1]
|
||||
result.append(items[j-1])
|
||||
w -= wt
|
||||
|
||||
return result
|
||||
|
||||
|
||||
bagged = knapsack01_dp(items, 400)
|
||||
print("Bagged the following items\n " +
|
||||
'\n '.join(sorted(item for item,_,_ in bagged)))
|
||||
val, wt = totalvalue(bagged)
|
||||
print("for a total value of %i and a total weight of %i" % (val, -wt))
|
||||
36
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-3.py
Normal file
36
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-3.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
def total_value(items, max_weight):
|
||||
return sum([x[2] for x in items]) if sum([x[1] for x in items]) <= max_weight else 0
|
||||
|
||||
cache = {}
|
||||
def solve(items, max_weight):
|
||||
if not items:
|
||||
return ()
|
||||
if (items,max_weight) not in cache:
|
||||
head = items[0]
|
||||
tail = items[1:]
|
||||
include = (head,) + solve(tail, max_weight - head[1])
|
||||
dont_include = solve(tail, max_weight)
|
||||
if total_value(include, max_weight) > total_value(dont_include, max_weight):
|
||||
answer = include
|
||||
else:
|
||||
answer = dont_include
|
||||
cache[(items,max_weight)] = answer
|
||||
return cache[(items,max_weight)]
|
||||
|
||||
items = (
|
||||
("map", 9, 150), ("compass", 13, 35), ("water", 153, 200), ("sandwich", 50, 160),
|
||||
("glucose", 15, 60), ("tin", 68, 45), ("banana", 27, 60), ("apple", 39, 40),
|
||||
("cheese", 23, 30), ("beer", 52, 10), ("suntan cream", 11, 70), ("camera", 32, 30),
|
||||
("t-shirt", 24, 15), ("trousers", 48, 10), ("umbrella", 73, 40),
|
||||
("waterproof trousers", 42, 70), ("waterproof overclothes", 43, 75),
|
||||
("note-case", 22, 80), ("sunglasses", 7, 20), ("towel", 18, 12),
|
||||
("socks", 4, 50), ("book", 30, 10),
|
||||
)
|
||||
max_weight = 400
|
||||
|
||||
solution = solve(items, max_weight)
|
||||
print "items:"
|
||||
for x in solution:
|
||||
print x[0]
|
||||
print "value:", total_value(solution, max_weight)
|
||||
print "weight:", sum([x[1] for x in solution])
|
||||
30
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-4.py
Normal file
30
Task/Knapsack-problem-0-1/Python/knapsack-problem-0-1-4.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
n=5; N=n+1; G=5; a=2**N # KNAPSACK 0-1 DANILIN
|
||||
L=[];C=[];e=[];j=[];q=[];s=[] # rextester.com/BCKP19591
|
||||
d=[];L=[1]*n;C=[1]*n;e=[1]*a
|
||||
j=[1]*n;q=[0]*a;s=[0]*a;d=[0]*a
|
||||
|
||||
from random import randint
|
||||
for i in range(0,n):
|
||||
L[i]=randint(1,3)
|
||||
C[i]=10+randint(1,9)
|
||||
print(i+1,L[i],C[i])
|
||||
print()
|
||||
|
||||
for h in range(a-1,(a-1)//2,-1):
|
||||
b=str(bin(h))
|
||||
e[h]=b[3:len(b)]
|
||||
|
||||
for k in range (n):
|
||||
j[k]=int(e[h][k])
|
||||
q[h]=q[h]+L[k]*j[k]*C[k]
|
||||
d[h]=d[h]+L[k]*j[k]
|
||||
|
||||
if d[h]<= G:
|
||||
print(e[h], G, d[h], q[h])
|
||||
print()
|
||||
|
||||
max=0; m=1
|
||||
for i in range(a):
|
||||
if d[i]<=G and q[i]>max:
|
||||
max=q[i]; m=i
|
||||
print (d[m], q[m], e[m])
|
||||
Loading…
Add table
Add a link
Reference in a new issue