zoukankan      html  css  js  c++  java
  • 小猫爬山

    题目

    题目描述
    翰翰和达达饲养了N只小猫,这天,小猫们要去爬山。
    经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。
    翰翰和达达只好花钱让它们坐索道下山。
    索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。
    当然,每辆缆车上的小猫的重量之和不能超过W。
    每租用一辆缆车,翰翰和达达就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?
    输入
    第1行:包含两个用空格隔开的整数,N和W。
    第2..N+1行:每行一个整数,其中第i+1行的整数表示第i只小猫的重量Ci。
    输出
    输出一个整数,表示最少需要多少美元,也就是最少需要多少辆缆车。
    样例输入
    5 1996
    1
    2
    1994
    12
    29
    样例输出
    2
    提示
    1≤N≤18,
    1≤Ci≤W≤1e8
    分析
    这道题是一道深搜题,首先需要给每只小猫的重量排序,越重的越早安排。之后用搜索求出最少要多少个缆车。
    #include<bits/stdc++.h>
    #define N 10000010
    using namespace std;
    int n,w,ans;
    int c[N],ysr[N];
    void dfs(int u,int sum){//u表示猫的编号,sum表示已用车的数量 
        if(sum>ans) return ;//剪枝 
        if(u==n+1){//如果说有的猫都上了缆车,更新答案 
            ans=sum;
            return ;
        }
        for(int i=1;i<=sum;i++){
            if(ysr[i]+c[u]<=w){//如果可以放猫 
                ysr[i]+=c[u];
                dfs(u+1,sum);//缆车数量不加 
                ysr[i]-=c[u];
            }
        }
        ysr[sum+1]=c[u];
        dfs(u+1,sum+1);//缆车数量+1 
        ysr[sum+1]=0;
    }
    bool cmp(int x,int y){//先安排重的小猫 
        return x>y;
    }
    int main()
    {
        scanf("%d%d",&n,&w);
        for(int i=1;i<=n;i++){
            scanf("%d",&c[i]);
        }
        ans=n;
        sort(c+1,c+n+1,cmp);//排序 
        dfs(1,0);//搜索 
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    数据类型
    32个关键字
    标识符
    Xcode常用快捷键
    Linux中级之keepalived配置
    linux中级之keepalived概念
    Linux中级之lvs三个模式的图像补充(nat,dr,tun)
    linux中级之防火墙的数据传输过程
    Linux中级之netfilter/iptables应用及补充
    linux中级之lvs配置(命令)
  • 原文地址:https://www.cnblogs.com/earth833/p/11313733.html
Copyright © 2011-2022 走看看