zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    【新提醒】N820 N821 android 4.2 V1.1版
    Silk Icons —— 再来 700 个免费小图标
    解决基于BAE python+bottle开发上的一系列问题
    gae 已死,别整什么反向代理了,用sae吧,还有在线编辑工具
    MDCC为移动开发者服务:一看、一聊、一聚
    Testin_百度百科
    我们的开源项目-暨开源力量公开课年度庆典活动
    Kivy: Crossplatform Framework for NUI
    进京通行证_百度百科
    史丹·温斯坦称傲牛熊市的秘密_百度百科
  • 原文地址:https://www.cnblogs.com/hhlya/p/13336748.html
Copyright © 2011-2022 走看看