暴力:暴力は01バックパックのセットを、以下のいくつかを列挙
F [i]は[J] F、番号方式リュックjの容量で、私の項目に示す[I] [J] = F [I-1]を[J] + F [I-1] [JW [ I]はO(n ^ 3)
最適化:01スタートとバックパックの消失を考慮していません、
Gの定義[I] [j]はiは表現され消え、プログラムjの数の容量、G [i]は[J] = F [N] [J] - 法的ありません
= G [i]の[JW [I] - [I] [J]グラムに対してアップしています
1の#include <iostreamの> 2の#include <CStringの> 3の#include <cstdioを> 4 使って 名前空間STDを、 5 のconst int型 MAXN = 2005 ; 6 の#define Rレジスタ 7 INT [MAXN、W、N、M。 8 int型F [MAXN] [MAXN]、G [MAXN] [MAXN]。 9 のint main()の 10 { 11 のscanf(" %d個の%のD "、&N、&M)。 12 のための(R用のint i = 1 ; iは= N <++ I) 13 scanf関数(" %のD "、&W [I])。 14 F [ 0 ] [ 0 ] = 1 。 15 のための(R用のint i = 1 ; I <= N ++ I) 16 のための(R INT J = 0 ; J <= M; ++ j)は{ 17 F [I] [J] = F [I- 1 ] [j]は%10 。 18 であれば(JW [I]> = 0)(F [I] [J] + = F [I- 1 ] [JW [I])%= 10 。 19 } 20 のために(INT I = 1 ; I <= N; I ++ ) 21である ため(INT J = 0 ; J <=は、M、J ++ ){ 22は %G [I] [J] = F [N-] [J] 10 ; 23は IF( JW [I]> = 0)(G [I] [J] - = G [i]が[JW [I])%= 10 ; 24 } // i番目の項目が選択されていない場合、ナップザック容量J、 Iを選択した場合、Gによって[i]は[JW [私は ]( iで表される基から選択されていない、バックパックは、[I] JW)明らかに引くために転送される 25 のために(INT I = 1 ; I <= N; I ++は){ 26である ため(INT J = 1 ; J <= M J ++ ) 27 printf(" %dの"、(G [I] [J] + 10)%10 )。 28の プット("" ); 29 } 30 }