説明
所与 のn サイズ愛を持つアイテム、整数 mは バックパックの大きさを表します。どのように完全なあなたは、このバックパックを埋めることができますか?
あなたは小さな断片に任意の項目を分割することはできません。
例
Example 1:
Input: [3,4,8,5], backpack size=10
Output: 9
Example 2:
Input: [2,3,5,7], backpack size=12
Output: 12
チャレンジ
O(n×mの)時間とO(M)メモリ。
O(n×mの)メモリを使用すると、メモリを最適化する方法がわからない場合も可能です。
思考:F [i] [j]は、i番目の元記事を充填することができる容量Jバックパックにアイテムの数から選択される示します。
パブリッククラスソリューション{ / ** * @param M:アンmはバックパックのサイズを表す整数 * @param A:与えられたNサイズAと項目[I] * @return:最大サイズ * / パブリックINTバックパック(INT M 、INT [] A){ ブールF []は[] =新しいブール[A.length + 1] [M + 1]。 {(I ++; I <= A.length INTがI = 0)するための (int型J = 0であり、j <= Mであり、j ++)のために{ F [I] [J] = FALSE; } } F [0] [0] = TRUE; 以下のために(INT I = 1; I <= A.length; I ++){ ため(INT J = 0であり、j <= Mであり、j ++){ F [I] [J] = F [I - 1] [J]。 IF(J> = A [I-1] && F [I-1] [J - A [I-1]]){ F [I] [J] = TRUE; } } // jに対する } //私は のために(INT I = M、I> = 0; i--){ IF(F [A.length] [I]){ Iを返します。 } } 0を返します。 } }
O(M)空間ソリューションの複雑さ
パブリッククラスソリューション{ / ** * @param M:アンmはバックパックのサイズを表す整数 * @param A:与えられたNサイズAと項目[I] * @return:最大サイズ * / パブリックINTバックパック(INT M 、INT [] A){ int型のF [] =新しいINT [M + 1]。 <{(A.length I ++ iについてINT iが= 0) {(j--にint J = M; J = A [i])と> 、F [J] = Math.max(F [j]をF [J - A [I]] + A [I])。 } } [M] Fリターン。 } }