組合
題目描述
已知一個一維數組a1..n,又已知一整數m。 如能使數組a中任意幾個元素之和等於m,則輸出YES,反之則為NO。
輸入
輸入包括兩行,第一行包含兩個整數n m(1<=n<20,1<=m<=1000000),第二行輸入n個整數(每個數不會超過1000000)。
輸出
如能使數組a中任意幾個元素之和等於m,則輸出YES,反之則為NO。
樣例輸入
6 5
2 3 1 4 2 1
樣例輸出
YES
提示
(None)
代碼+注釋
#include <bits/stdc++.h>
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;
}