解法一、DFS
🔹 剪枝
當 sum > m 時,因為輸入是正整數
所以之後的 sum 只有可能比 m 大,沒有可能 = m
✅ 完整代碼
評分結果(參考) : AC (1s, 344KB)
#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> nums;
vector<int> ans;
bool haveSol = false;
void dfs(int sum, int i, int j){
if(sum>m || i>n) return;
if(sum == m){
haveSol = true;
for(int k=0; k<j; k++){
if(k != 0) cout << " ";
cout << ans[k];
}
cout << "\n";
return;
}
for(; i<n; i++){
ans[j] = nums[i];
dfs(sum+nums[i], i+1, j+1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
nums.resize(n);
ans.resize(n);
for(int& i : nums) cin >> i;
sort(nums.begin(), nums.end());
dfs(0, 0, 0);
if(!haveSol) cout << "-1";
return 0;
}