Problem’s Link:https://www.patest.cn/contests/gplt/L3-001
sort一下DFS挨个搜就好
注意剪枝掉s
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int N=1e4+10;
int a[N];
int n,m;
int flag,sum,flag2,s;
vector<int> v;
void dfs(int i,int d){
if(i==n+1||flag) return;
if(a[i]+sum>m){
return;
}
else if(a[i]+sum==m){
v.push_back(a[i]);
flag=1;
return;
}
else{
sum+=a[i];
v.push_back(a[i]);
flag2=0;
for(int j=i+1;j<=n;j++){
dfs(j,d+1);
if(flag) return;
}
sum-=a[i];
v.pop_back();
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
s=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s+=a[i];
}
sort(a+1,a+n+1);
flag=0;
if(a[1]>m||s<m){
puts("No Solution");
continue;
}
else if(a[1]==m){
printf("%d\n",a[1]);
continue;
}
else if(s==m){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
continue;
}
for(int i=1;i<=n;i++){
if(flag) break;
sum=0;
dfs(i,0);
}
if(flag){
for(int i=0;i<v.size()-1;i++){
printf("%d ",v[i]);
}
printf("%d\n",v[v.size()-1]);
}
else puts("No Solution");
v.clear();
}
}