得到整数x
题目描述
小明有 n 个互不相同的正整数,现在他要从这 n 个正整数之中无重复地选取任意个数,并仅通过加法凑出整数 X。求小明有多少种不同的方案来凑出整数 X。
输入描述
第一行,输入两个整数 n, X。
接下来输入 n 个整数,每个整数不超过 100。
输出描述
输出一个整数,表示能凑出 X 的方案数。
用例输入 1
6 6
1 2 3 4 5 6
用例输出 1
4
数据规模与约定
1
≤
n
≤
20
1≤n≤20
1≤n≤20,
1
≤
X
≤
2000
1≤X≤2000
1≤X≤2000。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int ans = 0;
int a[21];
vector<int> path;
// 回溯搜索
void backtracking(int n, int x, int startIndex, int sum)
{
if (sum > x) // 如果当前递归中sum的值已经大于了x,终止递归
return;
if (sum == x) // 找到一个答案,方案数加加
ans++;
for (int i = startIndex; i <= n; i++) // 组合问题,为避免重复搜索,需从startIndex开始遍历,每次递归startIndex都会+1
{
// 统计当前数字
path.push_back(i);
sum += a[i];
// 递归
backtracking(n, x, i + 1, sum);
// 回溯
path.pop_back();
sum -= a[i];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, x;
cin >> n >> x;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
backtracking(n, x, 1, 0);
cout << ans << "\n";
return 0;
}