例6.13は、1次元配列a[1..n](n<25)が知られており、整数mも知られている.配列aの任意の数を


/*例6.13既知の1次元配列a 1..n、整数mも知られている.配列a中の任意の幾つかの要素の和をmに等しくすることができれば、YESを出力し、逆にNOとする.【解析】1つの決定された配列a[1.n]と1つの決定された数mについて、配列a中の任意のいくつかの要素の和をmに等しくできるか否かを判断することは、配列aから任意の数を取ってmにすることができるか否かを判断することに等しい.aの任意の要素a[n]に対して、取るか取らないかの2つの場合のみ:
(1)a[n]:このとき問題は、1つの決定された配列a[1.n-1]と1つの決定された数m-a[n]について、配列a[1.n-1]の任意のいくつかの要素の和をm-a[n]に等しくできるか否かを判断することに変換される.
(2)a[n]を取らない:このとき問題は、1つの決定された配列a[1.n-1]と1つの決定された数mについて、配列a[1.n-1]の任意のいくつかの要素の和をmに等しくできるかどうかを判断することに変換される.
        sum(n,m)       a[1..n]         m,
      sum(n-1,m-a[n]) sum(n-1,m)        ,

     sum(n,m)  ,    。  ,         。

       : 
    if (a[n]==m)    sum=true; 
    else if (n==1)  sum=false;

全過程変数作成プログラムは以下の通りである:*/#includeusing namespace std;const int max1=51;int a[max1],n,m;bool flag;void sum(int ,int );int main(){ cin>>n;for (int i=1; i<=n;++i) cin>>a[i];cin>>m;
flag=false;

sum(n,m);

if (flag)  cout<

}void sum(int n,int m){if(a[n]==m)flag=true;//グローバル変数falg伝達結果else if(n==1)return;//n=1を再帰境界としてelse//再帰しない2種類の選択{sum(n-1,m-a[n]);sum(n-1,m);}}