题解 | #神奇的口袋#
神奇的口袋
https://www.nowcoder.com/practice/9aaea0b82623466a8b29a9f1a00b5d35
深度优先搜索,搜索状态为(累加和,当前位置),沿下标递增顺序搜索,保证结果中没有重复的计数
#include <iostream> #include <queue> #include <algorithm> using namespace std; int num = 0; int n; int a[20]; void dfs(int sum, int pos) { if (sum == 40) { num++; return; } else if (sum > 40) return; else { for (int i = pos; i < n; i++) dfs(sum + a[i], i+ 1);//沿下标递增方向搜索,保证不走回头路 } } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) { cin >> a[i]; } dfs(0, 0); cout << num<< endl; return 0; } // 64 位输出请用 printf("%lld")