【TYVJ1340】送禮物(折半搜尋+hashmap)
阿新 • • 發佈:2018-12-30
當答案可以分為兩半時 為了降低複雜度 可以使用折半搜尋
對前半部分 搜出所有可能的和 用map記錄
對後半部分 同樣也是搜出可能的和 如果前半部分存在一個和 能拼起來 那ans++
#include<bits/stdc++.h> #define N 45 #define ll long long using namespace std; ll n,key,ans,a[N]; map <ll,int> M; void dfs1(int now,int end,ll sum) { if(now>end) { M[sum]++; return; } dfs1(now+1,end,sum); dfs1(now+1,end,sum+a[now]); } void dfs2(int now,int end,ll sum) { if(now>end) { ans+=M[key-sum]; return; } dfs2(now+1,end,sum); dfs2(now+1,end,sum+a[now]); } int main() { cin>>n>>key; for(int i=1;i<=n;i++) cin>>a[i]; dfs1(1,(1+n)/2,0); dfs2((1+n)/2+1,n,0); cout<<ans; return 0; }