6. 买瓜 (dfs剪枝)
作者:
闪回
,
2024-03-25 15:26:36
,
所有人可见
,
阅读 12
tips:防止劈出小数,处理的时候同时扩大两倍
感觉难度刚刚好
优化搜索顺序,从大到小搜索
最优性剪枝
可行性剪枝:比较重要的是一个预处理后缀和,判断剩余的瓜还够不够m
#include <iostream>
#include <algorithm>
using namespace std;
int n,ans=50;
long long m,a[50],sum[50];
void dfs(long long S,int i,int cnt){
if(cnt>=ans) return;
if(S==m) ans=cnt;
if(i>n||S>m||S+sum[i]<m) return;
dfs(S,i+1,cnt);
dfs(S+a[i],i+1,cnt);
dfs(S+a[i]/2,i+1,cnt+1);
}
int main()
{
// 请在此输入您的代码
cin>>n>>m;
m<<=1;
for(int i=0;i<n;++i){
cin>>a[i];
a[i]<<=1;
}
sort(a,a+n,greater<>());
for(int i=n-1;i>=0;--i){
sum[i]=sum[i+1]+a[i];
}
dfs(0,0,0);
if(ans==50){
cout<<-1<<endl;
}else{
cout<<ans<<endl;
}
return 0;
}