ダイナミック企画魔法のポケット

リンク: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]が[ビッグ]。
        } 


}

 

おすすめ

転載: www.cnblogs.com/hetaoyuan/p/11334955.html