diff --git a/Blatt2/23ss_MiM_Bonus_02.pdf b/Blatt2/23ss_MiM_Bonus_02.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c625357aea4fe95b86d748fba46a40c2bb771725
Binary files /dev/null and b/Blatt2/23ss_MiM_Bonus_02.pdf differ
diff --git a/Blatt2/Knapsack.py b/Blatt2/Knapsack.py
new file mode 100644
index 0000000000000000000000000000000000000000..2ec75b6746fd0649927dfc2d15048fa5797f25e0
--- /dev/null
+++ b/Blatt2/Knapsack.py
@@ -0,0 +1,129 @@
+import numpy as np
+
+#config:
+solve_brute_force = True
+solve_dynamic     = False
+
+# item:
+#  name weight value
+weight = 1
+value = 2
+
+def dynamic(items: list, capacity: int) -> list:
+    num_items = len(items)
+    array = np.zeros(shape=(num_items+1, capacity), dtype=int)
+    for row, item in enumerate(items, start=1):
+        help_row = np.array[num_items]
+        for j, column in range(item[weight], capacity+1):
+            if item[1] >= j:
+                prev_weight = array[row-1]
+                if prev_weight + item[weight] <= column:
+                    help_row[column] = prev_weight + item[weight]
+                
+                pass #! 
+
+
+def traverse(items: list, max_weight: int, bits: list, level: int, depth: int, best_value, best_bits: list) -> list:
+    # Abbruchbedingung
+    weight = 0
+    value = 0
+    for i, item in enumerate(items):
+        if bits[i]:
+            weight += item[1]
+            value += item[2]
+    
+    # teste ob wert besser
+    if value >= best_value[0] and weight < max_weight:
+        best_value[0] = value
+        best_bits[0] = bits.copy()
+    
+    # gehe nicht tiefer
+    if level == depth:
+        # Ausgabe des Bitmusters
+        # print(bits)
+        return
+    
+    # traversiere links
+    bits[level] = 1
+    traverse(items=items,
+                max_weight=max_weight,
+                bits=bits,
+                level=level+1,
+                depth=depth,
+                best_value=best_value,
+                best_bits=best_bits)
+    
+    # Aufräumen
+    bits[level] = 0
+    
+    # traversiere rechts
+    #bits[level] = 0
+    traverse(items=items,
+                max_weight=max_weight,
+                bits=bits,
+                level=level+1,
+                depth=depth,
+                best_value=best_value,
+                best_bits=best_bits)
+
+def brute(items: list, capacity: int) -> list:
+    mybits = []
+    best_bits = []
+    for i in range(len(items)):
+        mybits.append(0)
+        
+    best_bits.append([])
+    best_bits[0] = mybits.copy()
+    best_value = [0]
+    
+    traverse(items=items,
+                max_weight=capacity,
+                bits=mybits,
+                level=0,
+                depth=len(items),
+                best_value=best_value,
+                best_bits=best_bits)
+    
+    print(best_bits)
+    gewicht = 0
+    for i, item in enumerate(items):
+        if best_bits[0][i]:
+            gewicht += item[1]
+            print(item[0])
+    print('Gewicht: ', gewicht)
+    print('Wert: ', best_value[0])
+
+def parse_data_file(path: str) -> list:
+    items = []
+    with open(file=path, mode='r') as file:
+        for line in file:
+            entries = line.split('\t')
+            if entries[0] != 'i':
+                items.append((str(entries[0]), int(entries[1]), int(entries[2])))
+    return items
+
+def get_items(file_path: str = None) -> list:
+    if file_path == None:
+        return [
+            ('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) # courtesy https://rosettacode.org/wiki/Knapsack_problem/0-1
+        ]
+    else:
+        return parse_data_file(file_path)
+
+if __name__ == "__main__":
+    
+    if solve_brute_force:
+        items = get_items()
+        brute(items, 500)
+    
+    if solve_dynamic:
+        items = get_items("Blatt2/knapsack01.data")
+        dynamic(items, 10000)
+        
+    
\ No newline at end of file
diff --git a/Blatt2/Rucksack_dynamischeProgrammierung.pdf b/Blatt2/Rucksack_dynamischeProgrammierung.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2cfec5e891f172a33a7e191d958badd54abe4311
Binary files /dev/null and b/Blatt2/Rucksack_dynamischeProgrammierung.pdf differ
diff --git a/Blatt2/knapsack01.data b/Blatt2/knapsack01.data
new file mode 100644
index 0000000000000000000000000000000000000000..9bdab7df04c751bf7986fb492efa6a7bd49d8ee5
--- /dev/null
+++ b/Blatt2/knapsack01.data
@@ -0,0 +1,201 @@
+i	Gewicht	Wert
+1	116	146
+2	46	759
+3	78	755
+4	106	926
+5	145	758
+6	136	921
+7	31	193
+8	96	705
+9	137	309
+10	109	345
+11	105	121
+12	187	628
+13	193	979
+14	198	97
+15	149	770
+16	193	91
+17	22	201
+18	95	157
+19	58	157
+20	199	394
+21	171	500
+22	102	182
+23	186	411
+24	124	532
+25	15	427
+26	131	746
+27	147	621
+28	64	315
+29	200	462
+30	32	802
+31	25	139
+32	6	262
+33	29	815
+34	191	535
+35	116	209
+36	50	698
+37	22	42
+38	5	163
+39	171	288
+40	200	879
+41	197	211
+42	113	173
+43	150	576
+44	164	916
+45	24	700
+46	197	412
+47	194	245
+48	151	924
+49	131	839
+50	5	186
+51	2	105
+52	46	333
+53	179	32
+54	152	511
+55	151	516
+56	36	98
+57	52	924
+58	123	363
+59	58	607
+60	184	196
+61	147	944
+62	159	438
+63	167	611
+64	114	817
+65	140	526
+66	42	10
+67	111	294
+68	127	313
+69	134	837
+70	73	279
+71	111	792
+72	188	891
+73	27	922
+74	196	358
+75	107	295
+76	175	731
+77	85	200
+78	120	982
+79	46	804
+80	19	602
+81	39	694
+82	90	833
+83	16	88
+84	173	133
+85	198	586
+86	103	653
+87	113	228
+88	187	193
+89	13	959
+90	175	79
+91	50	137
+92	108	139
+93	6	629
+94	7	861
+95	28	355
+96	134	156
+97	71	776
+98	182	64
+99	70	425
+100	20	201
+101	21	633
+102	26	815
+103	34	959
+104	82	283
+105	173	834
+106	50	512
+107	139	908
+108	36	5
+109	110	98
+110	198	984
+111	109	263
+112	32	801
+113	133	118
+114	32	152
+115	19	25
+116	67	168
+117	18	199
+118	166	945
+119	101	751
+120	54	48
+121	169	157
+122	167	433
+123	141	809
+124	121	960
+125	32	283
+126	81	486
+127	200	383
+128	33	154
+129	16	401
+130	99	85
+131	153	647
+132	124	36
+133	167	679
+134	41	929
+135	174	527
+136	57	544
+137	130	338
+138	21	95
+139	194	376
+140	147	86
+141	174	999
+142	109	141
+143	53	957
+144	186	215
+145	155	954
+146	148	973
+147	167	701
+148	136	769
+149	134	15
+150	73	35
+151	124	480
+152	160	754
+153	54	194
+154	87	91
+155	73	867
+156	175	219
+157	66	807
+158	54	357
+159	154	520
+160	75	55
+161	90	512
+162	45	718
+163	96	679
+164	34	103
+165	131	421
+166	158	160
+167	161	93
+168	100	593
+169	49	766
+170	104	928
+171	194	191
+172	16	417
+173	35	527
+174	187	519
+175	89	884
+176	44	917
+177	193	210
+178	125	150
+179	50	140
+180	112	416
+181	45	724
+182	61	232
+183	4	865
+184	55	996
+185	48	751
+186	124	449
+187	96	749
+188	178	731
+189	54	87
+190	194	192
+191	162	285
+192	12	700
+193	116	200
+194	173	914
+195	129	893
+196	192	326
+197	129	71
+198	17	714
+199	132	946
+200	9	610