38分,求调(萌新真心求大佬)
查看原帖
38分,求调(萌新真心求大佬)
658786
STUDENT00楼主2022/10/3 15:54

我写完折半搜索后在输出答案时用了(ans-1)/2,请问是这个的问题吗?

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,a[20],k1,k2,p[59049],q[59049],last,ans;
void dfs(int now,int s,bool flag){
	if(now==last){
		if(flag) p[k1++]=s;
		else q[k2++]=s;
		return;
	}
	dfs(now+1,s,flag);
	dfs(now+1,s+a[now],flag);
	dfs(now+1,s-a[now],flag);
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);   
	last=(n>>1);
	dfs(0,0,1);
	last=n;
	dfs(n>>1,0,0);
	sort(p,p+k1);
	sort(q,q+k2);
	for(int i=0;i<k1;i++) ans+=upper_bound(q,q+k2,p[i])-upper_bound(q,q+k2,p[i]-1);
	printf("%d",(ans-1)/2);
	return 0;
}
2022/10/3 15:54
加载中...