Cześć, wygląda na to że program wykracza poza rozmiar tablicy podczas obliczeń. Polecam napisanie własnego generatora danych testowych i użycie narzędzi do wykrywania tego typu problemu do szybkiej identyfikacji gdzie znajduję się problem, np. AddressSanitizer oferowany przez gcc i clang, alternatywnie valgrind. Przykładowo:
$ clang++ -fsanitize=undefined -fsanitize=address -g -Wall a.cpp
$ cat test.in
1
1
72
$ ./a.out < test.in
=================================================================
==8171==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x612000000160 at pc 0x0000004d1005 bp 0x7ffeb5bcbb90 sp 0x7ffeb5bcbb88
WRITE of size 4 at 0x612000000160 thread T0
#0 0x4d1004 in knapsack_mod(int, int*, int) /tmp/a.cpp:48:15
#1 0x4d3487 in main /tmp/a.cpp:93:15
#2 0x7f8d3900e7fc in __libc_start_main csu/../csu/libc-start.c:332:16
#3 0x41f369 in _start (/tmp/a.out+0x41f369)
0x612000000160 is located 0 bytes to the right of 288-byte region [0x612000000040,0x612000000160)
allocated by thread T0 here:
#0 0x4ce11d in operator new[](unsigned long) (/tmp/a.out+0x4ce11d)
#1 0x4d0c40 in knapsack_mod(int, int*, int) /tmp/a.cpp:46:16
#2 0x4d3487 in main /tmp/a.cpp:93:15
#3 0x7f8d3900e7fc in __libc_start_main csu/../csu/libc-start.c:332:16