解法一、DFS
🔹 剪枝
當 sum+nums[i] > m 時,因為數組經過排序
所以之後的 sum+nums[i] 都會比 m 大
也就不用試了,直接 break
✅ 完整代碼
評分結果(參考) : AC (0.4s, 336KB)
#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){
    if(i>n) return;
    if(sum == m){
        haveSol = true;
        for(int j=0; j<ans.size(); j++){
            if(j != 0) cout << " ";
            cout << ans[j];
        }
        cout << "\n";
        return;
    }
    
    for(; i<n; i++){
        if(sum+nums[i] > m) break;
        
        ans.push_back(nums[i]);
        dfs(sum+nums[i], i+1);
        ans.pop_back();
    }
}
int main(){
    ios::sync_with_stdio(false); 
    cin.tie(nullptr);
    
    cin >> n >> m;
    
    nums.resize(n);
    
    for(int& i : nums) cin >> i;
    sort(nums.begin(), nums.end());
    dfs(0, 0);
    if(!haveSol) cout << "-1";
    return 0;
}