比赛 NOIP水题争霸赛 评测结果 AAAAAAATTT
题目名称 博士的密码 最终得分 70
用户昵称 kirikko 运行时间 4.021 s
代码语言 C++ 内存使用 0.22 MiB
提交时间 2018-02-11 21:03:05
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
bool ok;
int n,key,a[45],ans=0;
LL sum1[45],sum2[45];
void init(){
	scanf("%d%d",&n,&key);
	for(int i=1;i<=n;i++){
	scanf("%d",&a[i]);
	if(a[i]>0) sum1[i]=sum1[i-1]+a[i],sum2[i]=sum2[i-1];
	else sum2[i]=sum2[i-1]+a[i],sum1[i]=sum1[i-1];	
	}
} 

void run(int x,int cnt){
	if(x>n){
		if(cnt==key) ans++;
		return;
	}

	if(ok&&cnt+sum1[n]-sum1[x-1]<key) return;
	if(!ok&&cnt+sum2[n]-sum2[x-1]>key) return;
	
	for(int i=1;i>=0;i--){
		if(i) run(x+1,cnt+a[x]);
		else run(x+1,cnt); 
	}
}

int main(){
	freopen("password1.in","r",stdin);
	freopen("password1.out","w",stdout); 
	
	init();
	
	if(key>0) ok=true;
	else ok=false;
	
	run(1,0);
	
	printf("%d",ans);
	
	return 0;
}