リンク:https://www.nowcoder.com/questionTerminal/9aaea0b82623466a8b29a9f1a00b5d35?orderByHotValue=0&commentTags=C/C++
出典:牛オフネットワーク
魔法のポケットがあり、合計容量は、これらの項目の総容量は40でなければならない、この記事のポケットのいくつかのバリエーションで、40でした。ジョンは今N取得する項目があり、各アイテムの体積をそれぞれA1、A2、......。物体40の総体積が選択されている場合、ジョンは、次いで、これらのアイテムを得ることができる魔法のポケット、ジョンを使用して、これらの項目の一部から選択することができます。質問は今、項目を選択するジョンどのように多くの異なる方法です。
説明を入力します。
第一の入力線は正の整数N(1 <= N <= 20)であり、異なるアイテムの数を示します。次のn行、各行が1と40の間の正の整数であり、それぞれの値をA1、A2、...... Aを得ました。
出力説明:
出力選択モードの異なるアイテムの数。
例1
エントリー
3 20 20 20
輸出
3
典型的な01ナップザック問題
輸入 java.utilの。* ; パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ System.out.printlnは(多くの())。 } パブリック 静的 INT はるか(){ スキャナスキャナ = 新しいスキャナ(System.in)。 int型大= 40 ; INT、N = scanner.nextInt()。 INT []配列= 新しい INT [N + 1 ]。 INT [] [] DP = 新しい INT [N + 1] [+ビッグ1 ]。 にとって(int型、iがn = <; I = 0 iは++ ){ DPを[I] [ 0] = 1 ; } のための(INT J = 1; J <=ビッグあり、j ++ ){ DP [ 0] [j] = 0 ; } のために(int型私は++; iがn = <I = 1 {) 配列[I] = scanner.nextInt()。 } のための(int型 i = 1; iが<= N; iが++ ){ ため(INT J = 1; J <=ビッグあり、j ++ ){ 場合 > = J(配列[I]){ DP [I] [J] = DP [I - 1]〜[J] + DP [I - 1] [J - 配列[i]が]。 } 他{ DP [I] [J] = DP [I - 1 ] [J]。 } } } 戻りDP [n]が[ビッグ]。 } }