Perché istanzi più volte Scanner verso System.in? Lo detto un sacco di volte sul forum ultimamente. La creazione di un Scanner connesso a System.in va fatta UNA volta sola all'interno della applicazione.


Perché invochi 2 volte riempiZaino?

codice:
            riempiZaino(lista,capmax);
            int[]valoridiritorno= riempiZaino(lista,capmax);

Perché non incapsuli la gestione dello "zaino" (l'array e la somma) in una apposita classe? Non solo verrebbe più "pulito" ma ridurresti la logica nella tua parte principale.
Se non è proibito dall'esercizio .. ovviamente.