rt,用的折半搜索,理论复杂度 O(32n),WA#14,TLE#16~26 求助。
#include<iostream>
#include<unordered_map>
using namespace std;
int n,N,a[31],ans=114514;
long long m;
unordered_map <int,int> PII;
void LHQ(int G,int P,int J,long long sum){
if(sum>m) return;
if(sum==m){
PII[sum]=J;
return;
}
if(G==N+1){
if(sum<=m) PII[sum]=J;
return;
}
if(P==0) sum+=a[G]*2;
else if(P==1) sum+=a[G],J++;
for(int i=0;i<3;i++) LHQ(G+1,i,J,sum);
}
void HG(int G,int P,int J,long long sum){
if(sum>m) return;
if(sum==m){
ans=min(ans,PII[sum]+J);
return;
}
if(G==n+1){
//cout<<sum<<endl;
if(sum<=m&&PII.count(m-sum)) ans=min(ans,PII[m-sum]+J);
return;
}
if(P==0) sum+=a[G]*2;
else if(P==1) sum+=a[G],J++;
for(int i=0;i<3;i++) HG(G+1,i,J,sum);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
N=n/2;
m*=2;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=0;i<3;i++) LHQ(1,i,0,0);
for(int i=0;i<3;i++) HG(N+1,i,0,0);
cout<<ans;
}