B22 DFS剪枝 小猫爬山

视频链接:123 小猫爬山 DFS剪枝_哔哩哔哩_bilibili

CH2201 小猫爬山

 

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=30;
int n,w,ans=N,cnt;
int c[N],sum[N];

void dfs(int u){
  if(cnt>=ans) return; //最优性剪枝
  if(u==n){ans=cnt; return;} //边界
  
  for(int i=0;i<cnt;i++) //枚举已有车
    if(sum[i]+c[u]<=w){
      sum[i]+=c[u]; //装入第i辆车
      dfs(u+1);
      sum[i]-=c[u];
    }
    
  sum[cnt++]=c[u]; //新开一辆车
  dfs(u+1);
  sum[--cnt]=0;
}
int main(){
  cin>>n>>w;
  for(int i=0;i<n;i++)cin>>c[i];
  sort(c,c+n);
  reverse(c,c+n); //优化搜索顺序
  dfs(0);
  cout<<ans;
}

 

posted @ 2023-06-17 12:53  董晓  阅读(259)  评论(0编辑  收藏  举报