1 条题解
-
0
#include<bits/stdc++.h> using namespace std; // [1] 全局变量:n-数字数量,t-目标和,ans-符合条件的方案数;arr-存储输入数字(long long防溢出);dp-回溯临时存储选中元素 long long n, t, ans = 0; long long arr[50]; vector<long long> dp; // 深度优先搜索回溯函数:处理元素选/不选逻辑,主函数调用时跳转至此 void dfs(int x, long long sum, int num) { // [6] 递归终止条件:所有元素处理完毕(x从n倒序至0) if (x < 1) { // [7] 判断当前路径是否符合要求:和为目标值 且 至少选中一个元素 if (sum == t && num != 0) { // [8] 倒序遍历dp并输出,反转后与输入数字顺序一致 for (int i = dp.size() - 1; i >= 0; i--) { cout << dp[i] << " "; } cout << endl; ans++; // [9] 符合条件,方案数累加 } return; } // [10] 优先不选第x个元素,保证解的输出优先级,递归处理前x-1个元素 dfs(x - 1, sum, num); // [11] 选择第x个元素,加入临时存储数组 dp.push_back(arr[x]); // [12] 递归处理前x-1个元素,更新已选和与已选个数 dfs(x - 1, sum + arr[x], num + 1); // [13] 回溯核心操作:移除当前元素,恢复数组原始状态 dp.pop_back(); } int main() { // [2] 输入数字的总数量n cin >> n; // [3] 循环输入n个数字,按1开始的索引存入数组 for (int i = 1; i <= n; i++) { cin >> arr[i]; } // [4] 输入需要达成的目标和t cin >> t; // [5] 启动深度优先搜索,从最后一个元素(索引n)开始处理,初始和0、初始选中个数0 dfs(n, 0, 0); // [14] 自定义函数执行完毕,回到主函数,输出符合条件的总方案数 cout << ans; return 0; }
- 1
信息
- ID
- 1284
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者