Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,51 @@
from itertools import groupby
from collections import namedtuple
def anyvalidcomb(items, maxwt, val=0, wt=0):
' All combinations below the maxwt '
if not items:
yield [], val, wt
else:
this, *items = items # car, cdr
for n in range(this.number + 1):
w = wt + n * this.weight
if w > maxwt:
break
v = val + n * this.value
this_comb = [this] * n
for comb, value, weight in anyvalidcomb(items, maxwt, v, w):
yield this_comb + comb, value, weight
maxwt = 400
COMB, VAL, WT = range(3)
Item = namedtuple('Items', 'name weight value number')
items = [ Item(*x) for x in
(
("map", 9, 150, 1),
("compass", 13, 35, 1),
("water", 153, 200, 3),
("sandwich", 50, 60, 2),
("glucose", 15, 60, 2),
("tin", 68, 45, 3),
("banana", 27, 60, 3),
("apple", 39, 40, 3),
("cheese", 23, 30, 1),
("beer", 52, 10, 3),
("suntan cream", 11, 70, 1),
("camera", 32, 30, 1),
("t-shirt", 24, 15, 2),
("trousers", 48, 10, 2),
("umbrella", 73, 40, 1),
("waterproof trousers", 42, 70, 1),
("waterproof overclothes", 43, 75, 1),
("note-case", 22, 80, 1),
("sunglasses", 7, 20, 1),
("towel", 18, 12, 2),
("socks", 4, 50, 1),
("book", 30, 10, 2),
) ]
bagged = max( anyvalidcomb(items, maxwt), key=lambda c: (c[VAL], -c[WT])) # max val or min wt if values equal
print("Bagged the following %i items" % len(bagged[COMB]))
print('\n\t'.join('%i off: %s' % (len(list(grp)), item.name) for item, grp in groupby(sorted(bagged[COMB]))))
print("for a total value of %i and a total weight of %i" % bagged[1:])

View file

@ -0,0 +1,66 @@
from itertools import groupby
try:
xrange
except:
xrange = range
maxwt = 400
groupeditems = (
("map", 9, 150, 1),
("compass", 13, 35, 1),
("water", 153, 200, 3),
("sandwich", 50, 60, 2),
("glucose", 15, 60, 2),
("tin", 68, 45, 3),
("banana", 27, 60, 3),
("apple", 39, 40, 3),
("cheese", 23, 30, 1),
("beer", 52, 10, 3),
("suntan cream", 11, 70, 1),
("camera", 32, 30, 1),
("t-shirt", 24, 15, 2),
("trousers", 48, 10, 2),
("umbrella", 73, 40, 1),
("waterproof trousers", 42, 70, 1),
("waterproof overclothes", 43, 75, 1),
("note-case", 22, 80, 1),
("sunglasses", 7, 20, 1),
("towel", 18, 12, 2),
("socks", 4, 50, 1),
("book", 30, 10, 2),
)
items = sum( ([(item, wt, val)]*n for item, wt, val,n in groupeditems), [])
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, maxwt)
print("Bagged the following %i items\n " % len(bagged) +
'\n '.join('%i off: %s' % (len(list(grp)), item[0])
for item,grp in groupby(sorted(bagged))))
print("for a total value of %i and a total weight of %i" % (
sum(item[2] for item in bagged), sum(item[1] for item in bagged)))

View file

@ -0,0 +1,59 @@
items = {
"sandwich": (50, 60, 2),
"map": (9, 150, 1),
"compass": (13, 35, 1),
"water": (153, 200, 3),
"glucose": (15, 60, 2),
"tin": (68, 45, 3),
"banana": (27, 60, 3),
"apple": (39, 40, 3),
"cheese": (23, 30, 1),
"beer": (52, 10, 3),
"suntan cream": (11, 70, 1),
"camera": (32, 30, 1),
"t-shirt": (24, 15, 2),
"trousers": (48, 10, 2),
"umbrella": (73, 40, 1),
"w-trousers": (42, 70, 1),
"w-overcoat": (43, 75, 1),
"note-case": (22, 80, 1),
"sunglasses": (7, 20, 1),
"towel": (18, 12, 2),
"socks": (4, 50, 1),
"book": (30, 10, 2),
}
item_keys = list(items.keys())
#cache: could just use memoize module, but explicit caching is clearer
def choose_item(weight, idx, cache):
if idx < 0: return 0, []
k = (weight, idx)
if k in cache: return cache[k]
name, w, v, qty = item_keys[idx], *items[item_keys[idx]]
best_v, best_list = 0, []
for i in range(0, qty + 1):
wlim = weight - i * w
if wlim < 0: break
val, taken = choose_item(wlim, idx - 1, cache)
if val + i * v > best_v:
best_v = val + i * v
best_list = taken[:]
best_list.append((i, name))
cache[k] = [best_v, best_list]
return best_v, best_list
v, lst = choose_item(400, len(items) - 1, {})
w = 0
for cnt, name in lst:
if cnt > 0:
print(cnt, name)
w = w + items[name][0] * cnt
print("Total weight:", w, "Value:", v)