1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| import requests
BASE = 'https://www.wechall.net/en/challenge/training/programming/knapsaak' COOKIES = {'WC': '...'}
def parse_problem(text): items = [] meta = {} for line in text.strip().split('\n'): if '=' not in line: continue k, v = line.split('=', 1) k, v = k.strip(), v.strip() if k in ('Items', 'Sum', 'Stock', 'Level'): meta[k] = int(v) else: items.append((k, int(v))) return items, meta['Items'], meta['Sum'], meta['Stock']
def solve(items, need_count, need_sum, stock): n = len(items) prices = [p for _, p in items] names = [n for n, _ in items] order = sorted(range(n), key=lambda i: -prices[i]) sp = [prices[i] for i in order]
memo = {} def dfs(idx, ri, rs): if ri == 0 and rs == 0: return [0] * (n - idx) if idx == n or ri < 0 or rs < 0: return None key = (idx, ri, rs) if key in memo: return memo[key] if ri > stock * (n - idx): memo[key] = None; return None min_p, max_p = min(sp[idx:]), max(sp[idx:]) if rs < ri * min_p or rs > ri * max_p: memo[key] = None; return None
p = sp[idx] for qty in range(min(stock, ri, rs // p) + 1): sub = dfs(idx + 1, ri - qty, rs - qty * p) if sub is not None: memo[key] = [qty] + sub return memo[key] memo[key] = None return None
qs = dfs(0, need_count, need_sum) if qs is None: return None quants = [0] * n for i, orig_idx in enumerate(order): quants[orig_idx] = qs[i] return ''.join(str(quants[i]) + names[i] for i in range(n) if quants[i] > 0)
s = requests.Session() s.cookies.update(COOKIES)
for round_num in range(5): resp = s.get(f'{BASE}/problem.php') items, cnt, target, stock = parse_problem(resp.text) answer = solve(items, cnt, target, stock) resp2 = s.get(f'{BASE}/answer.php', params={'answer': answer}) print(f'Round {round_num+1}: {resp2.text.strip()}')
|