70分求助
查看原帖
70分求助
1112575
with_my_moon楼主2024/10/15 19:07
#include <math.h>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;

#define int long long 
int n;
long long m;
int a[40];
int f[1<<21],b[1<<21];
int ans=0;
int flag1,flag2;
int cnt1,cnt2;

void dfs1(int s,int e,long long cost){
    if(s==e){
        f[++cnt1]=cost;
        if(a[s]+cost<=m) f[++cnt1]=a[s]+cost;
        return;
    }
    if(a[s]+cost<=m) dfs1(s+1,e,cost+a[s]);
    dfs1(s+1,e,cost);
    return;
}

void dfs2(int s,int e,long long cost){
    if(s==e){
        b[++cnt2]=cost;
        if(a[s]+cost<=m) b[++cnt2]=a[s]+cost;
        return;
    }
    if(a[s]+cost<=m) dfs2(s+1,e,cost+a[s]);
    dfs2(s+1,e,cost);
    return;
}

int countans(){
    long long ans=0;
    for(int i=1;i<=cnt1;i++){
        int k=upper_bound(b+1,b+cnt2+1,m-f[i])-b-1;
        if(k>cnt2) continue;
		
        ans+=k;
    }
    return ans;
}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    dfs1(1,n/2,0);
    sort(f+1,f+cnt1+1);
    dfs2(n/2+1,n,0);
    sort(b+1,b+cnt2+1);
    cout<<countans()<<endl;
    return 0;
}
2024/10/15 19:07
加载中...