50分 求调 wa
查看原帖
50分 求调 wa
1148396
wch202101楼主2025/1/21 23:06
#include <bits/stdc++.h>
using namespace std;
long long n,m;
long long w[500];
long long cnt=0;
long long p[40000000];
long long k;
long long ans;
void dfs(long long u,long long s){
	if(u==k){
		p[++cnt]=s;
		return;
	}
	dfs(u+1,s);
	if(w[u]+s<=m){
		dfs(u+1,s+w[u]);
	}
}
void dfs2(long long u,long long s){
	if(u==n){
		int l=0,r=cnt;
		int t=m-s;
		while(l<r){
			int mid=l+r+1>>1;
			if(p[mid]>t){
				r=mid-1;
			}
			else l=mid;			
		}
		ans+=r;		
		return;
	}	
	dfs2(u+1,s);
	if(w[u]+s<=m){
	
		dfs2(u+1,w[u]+s);
	}
}
signed main(){
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>w[i];
	}
	if(k>=4)
	k=n/2+1;
	else k=n/2; 
	dfs(0,0);	
	sort(p+1,p+1+cnt);
	dfs2(k,0);
	cout<<ans<<endl;
	return 0;
}

正常的折半搜索,调了1个多小时了

2025/1/21 23:06
加载中...