挂了的数据
输入
4 2 6227020842
17 15 13 10
输出
1
已经确定bug在dfs里,但调不出来了
#include<iostream>
#include<cstdio>
#include<map>
#include <unordered_map>
#define db double
#define f(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int ztt=1222;
ll rd(){
ll x=0,w=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+(c-'0');
c=getchar();
}
return x*w;
}
ll jc[26],n,k,s;
ll a[ztt];
ll ans=0;
unordered_map<ll, ll> mp[30];
void dfs(int cur,int num,int sum,int opt){//下标,用了的!数量,和,1/2
if(!opt){//前半部分
if(cur>=((n>>1)+1)){
mp[num][sum]++;
return ;
}
}
else{//后半部分
if(cur>=n+1){//记答案
for(int i=0;i+num<=k;i++){
if(mp[i].count(s-sum)){
ans+=mp[i][s-sum];
}
}
return ;
}
}
dfs(cur+1,num,sum,opt);//不选
if(sum+a[cur]<=s)dfs(cur+1,num,sum+a[cur],opt);//选
if(sum+a[cur]<=s && a[cur]<=19 && sum+jc[a[cur]]<=s&&num<k)dfs(cur+1,num+1,sum+jc[a[cur]],opt);
return ;
}
int main(){
jc[1]=jc[0]=1;
f(i,2,23){
jc[i]=jc[i-1]*i;
}
n=rd();k=rd();s=rd();
f(i,1,n){
a[i]=rd();
}
dfs(1,0,0,0);
dfs(((n>>1)+1),0,0,1);
cout<<ans<<endl;
return 0;
}