#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=32;
const int INF=0x3f3f3f3f;
int n,m;
int ans=INF;
int a[N],houzhui[N];
bool v[N];
bool cmp(int a,int b){
return a>b;
}
void dfs(int i,double sum,int cnt){
if(sum==m){
ans=min(cnt,ans);
return ;
}
if(i>=n) return ;
if(sum>m) return ;
if(houzhui[i]<m-sum) return;
if(cnt>=ans) return ;
dfs(i+1,sum+a[i],cnt);//选,不切
dfs(i+1,sum+a[i]/2.0,cnt+1);//选,切
dfs(i+1,sum,cnt); //不选
}
signed main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n,cmp);
for(int i=n-1;i>=0;i--){
houzhui[i]=houzhui[i+1]+a[i];//后缀和,剪枝
}
dfs(0,0.0,0);
if(ans==INF)cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
蓝桥:3505买瓜(DFS)
最新推荐文章于 2024-07-23 17:36:37 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)