Acwing 165. 小猫爬山 dfs剪枝与优化

原题链接:Acwing 165. 小猫爬山
学习博客:[dfs] aw165. 小猫爬山(dfs剪枝与优化+好题)

#include 
using namespace std;
#define ull unsigned long long
int n,m;
int w[20];
int car[20];
int res=1e8;

void dfs(int u,int cnt)
{
    if(cnt>=res)
        return ;
    if(u==n)
    {
        res=min(res,cnt);
        return ;
    }
    for(int i=0;i<cnt;i++)
    {
        if(car[i]+w[u]<=m)
        {
            car[i]+=w[u];
            dfs(u+1,cnt);
            car[i]-=w[u];
        }
    }
    car[cnt]+=w[u];
    dfs(u+1,cnt+1);
    car[cnt]-=w[u];
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>w[i];
    }
    sort(w,w+n);
    reverse(w,w+n);
    dfs(0,0);
    cout<<res<<endl;
    return 0;
}

你可能感兴趣的:(算法,深度优先,剪枝,算法)