1 // 方法:再帰アイテムとアイテム・ボリューム数nの配列A [100]グローバル変数に、
2 // COUNT(I、SUM)が統計に、i番目のアレイバックの開始からの組み合わせの数を表し、そして種類の数の和、
3。 // 和と番号の組み合わせは次のとおりCOUT(I、合計)= COUT(I + 1、和[I])+ COUT(I + 1、合計)、
4。 // COUT(I + 1、sum-前記 [I])を表し、[i]は、次のカウント数最初のi + 1から、であること含ま
5 // 和の数および組み合わせ[I]であります型番、およびCOUT(I + 1、和)[i]は、であり、数字の数からI + 1以降の統計的組み合わせの種類の数********和を含まない示し***************************
6。の#include <入出力ストリームを>
7。 使用した 名前空間STD;
8
。9 int型 A [ 100 ];
10 int型 N- = 。1 ;
11 int型 COUNT(INT I、INT 和){
12は、 IF(和== 0 ){
13は リターン 1 ; // 和と番号の組み合わせのセットを見つける;
14 }
15を IF(I == N-和|| < 0)を返す 0。// I ==命令の他のn個が組み合わされていない、合計<0を組み合わせないことを示し、
16 リターン COUNT(I + 1、-SUM [I])+ COUNT(I + 1、SUM); // 配列から私は、最初にA [i]とを含む、開始されて含まれていません;
17 }
18である
19。 INT メイン(){
20は 、一方(CIN >> N-){
21です 以下のために(INT iが= 0 ; I <N; I ++ )
22 CIN >> [I]。
23 COUT <<カウント(0、40)<< ENDL。
24 }
25 リターン 0 。
26 }
1 // 方法2:動的プログラミング
2の#include <入出力ストリーム>
。3 使用して 名前空間STD;
4 の#define N 100
。5 INT N-、A [N];
6 int型のmain(){
7 一方(CIN >> N-){
8 INT(DP *)[ 50 ] = 新しい新しい INT [N] [ 50 ]; // DP [I] [J]はフロントボリュームCouchu Jのi番目の項目を示し、
図9 のための(INT iは= 1。 ; I <= N; ++ I ){
10 CIN >> A [I];
11 DP [I] [0 ] = 1 ; // 初始边界
12 }
13 DP [ 0 ] [ 0 ] = 1 ;
14 のために(INT iは= 1 ; iが<= N; I ++ )
15 のための(INT J = 1 ; J <= 40 ; J ++ ){
16 、DP [I] [J] = DP [I- 1 ] [J]。
17 であれば([I] <= J)
18 DP [I] [J] + = DP [I- 1 ] [J- A [I]]。
19 }
20 COUT << DP [n]が[ 40 ] << ENDL。
21 削除[] DP。
22 }
23 リターン 0 。
24 }