蓝桥杯刷题-16-买瓜-DFS+剪枝优化⭐⭐

本文介绍了在蓝桥杯2023年省赛中一道关于买瓜的题目,涉及如何通过剪枝优化深度优先搜索算法,以及采用贪心策略进行求解,同时提到了可能存在的超时问题和使用双向DFS的优化方法。
摘要由CSDN通过智能技术生成

蓝桥杯2023年第十四届省赛真题-买瓜
在这里插入图片描述

在这里插入图片描述

该如何剪枝呢?⭐⭐

  1. 如果当前方案的切的刀数,已经大于等于了之前已知合法方案的最优解,那么就没必要
    往后搜了。
  2. 如果后面的瓜的总和加起来,再加上当前已有的重量,都不到m,那么也没有必要搜索了。
  3. 如果你当前已有的重量超过了m,那么说明当前方案非法,直接return就好了。
  4. n个瓜遍历结束,你肯定要return。
  5. 我们将瓜从大到小排序,这是一个贪心。

这个代码有可能超时:

#include <iostream>
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
using namespace std;
const int N=100;
double a[N];
double s[N];
int n,m;
int ans=INF;当前合法方案的最小值。
void dfs(int u,double w,int cnt){
  if(w==m){
    ans=min(ans,cnt);
    return;
  }

  //剪枝
  //如果n个瓜都遍历完了,那就返回。
  if(u>=n)return;

  //如果当前方案并不优于已有的合法答案,那就返回。
  if(cnt>=ans)return;

  //如果总重量已经超了,那么当前方案不合法。
  if(w>m)return;
  //如果后面的瓜所有重量加起来,都小于m,则当前方案不合法。
  if(w+s[u]<m)return;

  //选,但不切
  dfs(u+1,w+a[u],cnt);
  //选,切
  dfs(u+1,w+a[u]/2.0,cnt+1);
  //不选
  dfs(u+1,w,cnt);
}
bool cmp(int x,int y){
  return x>y;
}
void solve(){
  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--){
    s[i]=s[i+1]+a[i];
  }
  dfs(0,0.0,0);
  if(ans==INF)ans=-1;
  cout<<ans<<endl;



}
signed main(){
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int t;
  t=1;
  //cin>>t;
  while(t--)
  solve();
}

进一步优化:
使用双向dfs
在这里插入图片描述

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值