萨日朗
查看原帖
萨日朗
777756
UFOI楼主2023/4/29 19:57

rt,用的折半搜索,理论复杂度 O(3n2)O(3^{\frac n 2}),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;
}
2023/4/29 19:57
加载中...