c++の組み合わせ

1208 ワード

コンポジット
タイトルの説明
既知の1次元配列a 1..n、整数mも知られている.配列a中の任意の幾つかの要素の和をmに等しくすることができれば、YESを出力し、逆にNOとする.
入力
入力は2つの行を含み、第1の行は2つの整数n m(1<=n<20,1<=m<=1000000)を含み、第2の行はn個の整数を入力する(各数は1000000を超えない).
しゅつりょく
配列a中の任意の幾つかの要素の和をmに等しくすることができれば、YESを出力し、逆にNOとする.
サンプル入力
6 5
2 3 1 4 2 1

サンプル出力
YES

ヒント
(None)
コード+コメント
#include 
using namespace std;
 
int nums[101];
int n;  //      
int m;  //     n     m
bool flag;
 
void sum(int n,int m)   //               m
{
    if(nums[n] == m) flag = true;  //              m, flag    true
    else if(n == 1) return ;    //          
    else
    {
        sum(n - 1,m - nums[n]);   //    nums[n]  
        sum(n - 1,m);   //     nums[n] 
    } 
} 
 
int main()
{
    cin >> n;
    for(int i = 1;i <= n;i ++)
    {
        cin >> nums[i]; 
    }
    cin >> m;
    flag = false; //   , flag  false,         m    sum   flag     
    sum(n,m);
    if(flag)
    cout << "Yes" << endl;
    else
    cout << "No" << endl;
    return 0;
}

転載先:https://www.cnblogs.com/LJA001162/p/11032241.html