• Acwing 165 小猫爬山 (dfs)


    题面

    翰翰和达达饲养了N只小猫,这天,小猫们要去爬山。

    经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

    翰翰和达达只好花钱让它们坐索道下山。

    索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。

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

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

    输入格式
    第1行:包含两个用空格隔开的整数,N和W。

    第2..N+1行:每行一个整数,其中第i+1行的整数表示第i只小猫的重量Ci。

    输出格式
    输出一个整数,表示最少需要多少美元,也就是最少需要多少辆缆车。

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

    思路

    搜索,好吧,我连搜索策略都找不到对。往往刚开始的想法是一辆一辆搜,不停装猫,但是可惜的是这个策略并不正确,因为可能我这个车有余量,而且这个余量可以装下后面的小猫,但这种情况会被我们忽略。所以我们换一种,用一个数组存储每个车的量,每次都去搜一遍所有车,有余量就装,没有就新开一个。

    代码实现

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<set>
    #include<queue>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int maxn=20;
    ll a[maxn];
    ll p[maxn];
    ll n,mostval;
    long long ans=1e9;
    bool cmp (ll a,ll b)  {
        return a>b;
    }
    inline void dfs (long long x,long long cnt) {
        if (cnt>=ans)  return ;
        if (x==n+1) {
            ans=min (cnt,ans);
            return ;
        }
        for (int i=1;i<=cnt;i++) {
            if (p[i]+a[x]<=mostval) {
                p[i]+=a[x];
                dfs (x+1,cnt);
                p[i]-=a[x];
            }
        }
        p[cnt+1]=a[x];
        dfs (x+1,cnt+1);
        p[cnt+1]=0;
    }
    int main () {
        cin>>n>>mostval;
        for (int i=1;i<=n;i++) cin>>a[i];
        sort (a+1,a+1+n,cmp);
        dfs (1,0);
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    如何卸载VS 2017之前版本比如VS 2013、VS2015、 VS vNext?
    在SQL Server中如何进行UPDATE TOP .....ORDER BY?
    EntityFramework 6.x和EntityFramework Core插入数据探讨
    2017-2018:时间戳
    http协议进阶(六)代理
    认清性能问题
    <转>安全测试思维导图
    RESTful API浅谈
    http协议进阶(五)连接管理
    聊聊软件测试的职业规划
  • 原文地址:https://www.cnblogs.com/hhlya/p/13336748.html
Copyright © 2020-2023  润新知