首页 > 其他分享 >AcWing 165. 小猫爬山(dfs)

AcWing 165. 小猫爬山(dfs)

时间:2023-03-08 20:35:55浏览次数:39  
标签:const int LL dfs 小猫 165 sum AcWing

https://www.acwing.com/problem/content/167/

一共N只小猫,每个缆车最大承重量为W。N只小猫的重量分别是 C1、C2……CN。

当然,每辆缆车上的小猫的重量之和不能超过 W。

每租用一辆缆车,翰翰和达达就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山? 

数据范围 1≤N≤18,1≤Ci≤W≤108
输入样例:
5 1996
1
2
1994
12
29
输出样例:
2

详解见代码内部注释部分

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-1e18;
const LL N=1e6+10,M=2023;
const LL mod=998244353;
const double PI=3.1415926535;
#define endl '\n'
LL n,m,a[N],che[N];
LL ans=18;
void dfs(LL idx,LL sum)
{
    if(sum>=ans) return ;//max18只猫,max18辆车,多了无所谓
    if(idx==n+1)
    {
        ans=sum;
        return ;
    }
    for(int i=1;i<=sum;i++)//看看这只猫猫能不能和前面哪一辆车的猫猫们挤一挤
    {
        if(a[idx]+che[i]<=m)//挤得进去
        {
            che[i]+=a[idx];//挤一挤
            dfs(idx+1,sum);//遍历下一只猫猫
            che[i]-=a[idx];//突然发现这样搭配不好(占空间,出来挤一挤别的
        }
    }
    //前面的都挤不进去
    che[sum+1]=a[idx];//自己new一辆
    dfs(idx+1,sum+1);//看看有没有别的猫猫伙伴来陪它
    che[sum+1]=0;//突然发现这样搭配也不好,出来再重新挤一挤
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        sort(a+1,a+n+1);
        reverse(a+1,a+n+1);
        /*
        for(int i=0;i<n;i++)
        {
            cout<<a[i]<<" ";
        }
        cout<<endl;
        */
        dfs(1,1);//从第1只猫猫开始,车子一开始准备1辆,因为Ci<=m,所以一辆车最少都装得下一个
        cout<<ans<<endl;
    }
    return 0;
}

标签:const,int,LL,dfs,小猫,165,sum,AcWing
From: https://www.cnblogs.com/Vivian-0918/p/17196006.html

相关文章

  • 【DFS】LeetCode 剑指 Offer 07. 重建二叉树
    题目链接剑指Offer07.重建二叉树思路递归建树,思路与【DFS】LeetCode105.从前序与中序遍历序列构造二叉树相同。代码classSolution{publicTreeNodebuild......
  • 4868. 数字替换(dfs,剪枝)
    https://www.acwing.com/problem/content/description/4871/似乎没什么好办法,只能暴搜了,bfs对于那么多状态的搜索容易tle(bfs会把所有状态都彻底搜索一遍,相比dfs不方便......
  • DFS
    DFS主要思想:1.终点,2.回溯。一、对于终点,我们要对其做一个特殊的处理也就是对结果的处理,处理完之后结束这一次的递归,即开始这一次递归的回溯二、回溯,有很多人都卡在这里。......
  • 力扣---1653. 使字符串平衡的最少删除次数
    给你一个字符串s,它仅包含字符'a'和'b'​​​​。你可以删除s中任意数目的字符,使得s平衡。当不存在下标对(i,j)满足i<j,且s[i]='b'的同时s[j]='a',此......
  • 【DFS】LeetCode 46. 全排列
    题目链接46.全排列思路本题是求排列问题.与组合问题不同的是,在排列问题中,不同的数字顺序被视为不同的排列,比如[1,2]与[2,1]是两种不同的排列。搜索树如下图所示,引......
  • 1653. 使字符串平衡的最少删除次数
    题目链接:  1653.使字符串平衡的最少删除次数-力扣(LeetCode) ......
  • 【DFS】LeetCode 90. 子集 II
    题目链接90.子集II思路去重方法与【DFS】LeetCode40.组合总和II思路相似代码classSolution{privateList<List<Integer>>result=newArrayList<>();......
  • DFS 序求 LCA
    很冷门的科技,但是有着显著的使用效果(减少建立虚树的常数)。本文学习自:Alex_Wei的博客首先遍历一遍整棵树,可以得到整棵树的DFS序和每个点的时间戳(记为\(dfn\))。考虑......
  • 【DFS】LeetCode 78. 子集
    题目链接78.子集思路求子集问题和77.组合(opensnewwindow)和131.分割回文串(opensnewwindow)又不一样了。如果把子集问题、组合问题、分割问题都抽象为一......
  • AcWing 4490. 染色题解
    题目描述样例输入:612215211111输出3算法描述思路我们以样例为例讲讲思路。如何确保dfs能顺利便利呢,我们可以使用链式前向星来存图(树)C++代......