DFS+剪枝
这种选和不选的题最好用递归做了,但是需要剪枝,然后就是对特殊情况的考虑,不然会超时。
注意
当数组中所有数的和加起来都达不到目标值,就没必要搜索了,直接输出无解
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+5;
const int maxx = 1e6+5;
int arr[maxn];
int dp[maxx];
int n, m, flag = 0;
vector<int> ans;
void dfs(int i, int sum, vector<int> v){
if(sum > m || flag == 1||i == n) return;
int cur = sum + arr[i];
if(cur == m){
v.push_back(arr[i]);
ans = v;
flag = 1;
return;
}
if(cur < m) {
v.push_back(arr[i]);
dfs(i+1, cur, v);
}
if(!v.empty()) v.pop_back();
dfs(i+1, sum, v);
}
int main(){
cin >> n >> m;
int sumx = 0;
for(int i = 0; i < n; i++){
cin >> arr[i];
sumx += arr[i];
}
if(sumx < m){
cout<<"No Solution";
return 0;
}
sort(arr, arr + n);
vector<int> v;
dfs(0, 0, v);
if(ans.size()==0){
cout<<"No Solution";
return 0;
}
for(int i=0;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-1) cout<<" ";
else cout<<endl;
}
return 0;
}