#include<bits/stdc++.h>
#define N 10010
using namespace std;
int n, m;
int a[N], b[N], p = 0;//p是数组a的指针
vector<int> temp;
bool flag = false;//剪枝,只要找到一组解,所有的全都结束
void dfs(int u, int v){//u为递归深度,v为当前价值
if(flag) return ;
if(u >= p) {
if(v == m) {
flag = true;
for(int i = 0; i < temp.size(); i++){
printf("%d", temp[i]);
i == temp.size()-1 ? printf("\n") : printf(" ");
}
}
return ;
}
if(v == m){
flag = true;
for(int i = 0; i < temp.size(); i++){
printf("%d", temp[i]);
i == temp.size()-1 ? printf("\n") : printf(" ");
}
return ;
}
else if(v > m){
return ;
}
for(int i = 1; i >= 0; i--){
v += a[u] * i;
if(i) temp.push_back(a[u]);
dfs(u+1, v);
v -= a[u] * i;
if(i) temp.pop_back();
}
}
int main() {
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", &b[i]);
sort(b, b+n);
for(int i = 0; i < n; i++){
if(b[i] <= m) a[p++] = b[i];
}
int sum = 0;
for(int i = 0; i < p; i++) sum += a[i];
if(sum < m) puts("No Solution");
else {
dfs(0, 0);
if(!flag) puts("No Solution");
}
return 0;
}
PAT甲1068 DFS+剪枝+特判
最新推荐文章于 2024-01-21 19:24:00 发布