#include<iostream>
#include<cstdio>
#include<algorithm>
#include<unordered_map>
using namespace std;
long int n, m, temp, arr[35], ans = 2147483646, mid;
unordered_map<int, int> mp;
void dfs1(long int sum, int cut, int index) {
if (sum > m || cut > ans || (mp.count(sum) && mp[sum] < cut)) return;
if (sum == m) ans = (cut < ans) ? cut : ans;
if (index == mid + 1) {
if (mp.count(sum)) mp[sum] = (cut < mp[sum]) ? cut : mp[sum];
else mp[sum] = cut;
return;
}
dfs1(sum, cut, index + 1);
dfs1(sum + arr[index], cut + 1, index + 1);
dfs1(sum + 2 * arr[index], cut, index + 1);
}
void dfs2(long int sum, int cut, int index) {
if (sum > m || cut > ans) return;
if (sum == m) ans = (cut < ans) ? cut : ans;
if (index == n + 1) {
if (!mp.count(sum)) mp[sum] = cut;
if (mp.count(m - sum)) ans = (mp[sum] + mp[m - sum] < ans) ? mp[sum] + mp[m - sum] : ans;
return;
}
dfs2(sum, cut, index + 1);
dfs2(sum + arr[index], cut + 1, index + 1);
dfs2(sum + 2 * arr[index], cut, index + 1);
}
int main() {
scanf("%ld %ld", &n, &m);
m *= 2;
for (int i = 0; i < n; i++) scanf("%ld", &arr[i]);
sort(arr, arr + n);
mid = (n - 1) / 2;
dfs1(0, 0, 0);
dfs2(0, 0, mid + 1);
printf("%ld", (ans == 2147483646) ? -1 : ans);
return 0;
}
基本上每三次提交有一次tle,两次WA,答案是3我输出的是2