rt,写的折半搜索,把排序顺序调换一下就 AC 了,
TLE 88 pts:
#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
const int N=35;
int n,m,ans=1145141919810;
int a[N];
unordered_map<int,int> b;
bool cmp(int x,int y){
return x>y;
}
void dfs(int now,int k,int sum,int step,bool op){
if(sum>m || step>ans)return ;
if(sum==m){
ans=min(ans,step);
return ;
}
if(now==k+1){
if(op==0){
if(b.count(sum))b[sum]=b[sum]<step?b[sum]:step;
else b[sum]=step;
}else{
if(b.count(m-sum))ans=min(ans,b[m-sum]+step);
}
return ;
}
dfs(now+1,k,sum,step,op);
dfs(now+1,k,sum+a[now],step,op);
dfs(now+1,k,sum+a[now]/2,step+1,op);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
m<<=1;
rep(i,1,n){
cin>>a[i];
a[i]<<=1;
}
sort(a+1,a+n+1,cmp);
dfs(1,n/2,0,0,0);
dfs(n/2+1,n,0,0,1);
if(ans==1145141919810)cout<<"-1\n";
else cout<<ans<<endl;
return 0;
}
AC:只需要将 sort 那一行改为 sort(a+1,a+n+1); 就过了。
题解区似乎没有明确说明,求各位大佬解惑。