萌新求助带数据
查看原帖
萌新求助带数据
889845
Wunsch楼主2023/7/18 20:26

挂了的数据

输入

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;
}


2023/7/18 20:26
加载中...