MLE和RE求助……我是真的弱
查看原帖
MLE和RE求助……我是真的弱
537458
struct_cym楼主2023/8/31 13:29
#include <bits/stdc++.h>
using namespace std;
const int N=35;
int n,k;
int nums[N];
int a[N],b[N];
int as[N],bs[N];
int ans=0x3f3f3f3f;
int leng1,leng2;
bool cmp(int a,int b){
	return a>b;
}
void dfs1(int step,int ed,int sum,int cnt) {
//	cout<<step<<" "<<sum<<" "<<cnt<<endl;
	if(sum>k){
		return;
	} 
	if(step==ed+1){
		a[++leng1]=sum;
		as[leng1]=cnt;
		return;
	}
	dfs1(step+1,ed,sum,cnt);
	dfs1(step+1,ed,sum+nums[step],cnt);
	dfs1(step+1,ed,sum+nums[step]/2,cnt+1);
}
void dfs2(int step,int ed,int sum,int cnt) {
//	cout<<step<<" "<<sum<<" "<<cnt<<endl;
	if(sum>k){
		return;
	}
	if(step==ed+1){
		b[++leng2]=sum;
		bs[leng2]=cnt;
		return;
	}
	dfs2(step+1,ed,sum,cnt);
	dfs2(step+1,ed,sum+nums[step],cnt);
	dfs2(step+1,ed,sum+nums[step]/2,cnt+1);
}
int main() {
	scanf("%d%d",&n,&k);
	k*=2;
	int mid=(n+1)>>1;
	int q;
	for(int i=1; i<=n; i++) {
		scanf("%d",&q);
		nums[i]=q*2;
	}
	dfs1(1,mid,0,0);
	dfs2(mid+1,n,0,0);
	sort(a+1,a+1+leng1);
//	for(int i=1;i<=leng1;i++){
//		cout<<a[i]<<" ";
//	}
//	cout<<endl;
//	for(int i=1;i<=leng2;i++){
//		cout<<b[i]<<" ";
//	}
//	cout<<endl;
	for(int i=1;i<=leng2;i++){
		if(b[i]>k){
			continue;
		}
		int d=lower_bound(a+1,a+1+leng1,k-b[i])-a;
//		cout<<d<<endl;
		if(a[d]+b[i]==k){
			ans=min(ans,as[d]+bs[i]);
		}
	}
	if(ans==0x3f3f3f3f){
		cout<<"-1"<<endl;
		return 0;
	}
	cout<<ans<<endl;
	return 0;
}
2023/8/31 13:29
加载中...