zoukankan      html  css  js  c++  java
  • 165. 小猫爬山 (dfs)

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

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

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

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

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

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

    输入格式

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

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

    输出格式

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

    数据范围

    1N181≤N≤18,
    1CiW1081≤Ci≤W≤108

    输入样例:

    5 1996
    1
    2
    1994
    12
    29
    

    输出样例:

    2

    解题思路:猫有两种选择 放到已有的车中 新开一辆车 减枝 1优先考虑决策少的从大到小排序 2大于最优解则返回
    #include <iostream>
    #include <cstring>
    #include <bitset>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    const int maxn=20;
    
    int n,m;
    int sum[maxn],cat[maxn];
    int res=maxn;
    
    void dfs(int u,int v){
        if(v>res) return;
        if(u==n){
            res=v;
            return;
        }
        for(int i=0;i<v;i++){
            if(cat[u]+sum[i]<=m){
                sum[i]+=cat[u];
                dfs(u+1,v);
                sum[i]-=cat[u];
            }
        }
        sum[v]=cat[u];   //新开一辆车
        dfs(u+1,v+1);
        sum[v]-=cat[u];
    }
    
    int main(){
        cin>>n>>m;
        for(int i=0;i<n;i++) cin>>cat[i];
        sort(cat,cat+n);
        reverse(cat,cat+n);
    
        dfs(0,0);   //那只猫, 多少辆车
        cout << res << endl;
        return 0;
    
    }
    dfs
  • 相关阅读:
    通过USB转TTL串口下载stm32程序
    实验一:基于STM32F1的流水灯实验(库函数)
    opencv 常用头文件介绍
    OpenCV 1.0在VC6下安装与配置(附测试程序)
    在Angularjs使用中遇到的那些坑
    js和ts关于遍历的几个小总结
    angularjs的启动方式
    关于跨域和如何解决跨域问题的小结
    TypeScript(入门)
    截取字符串部分汇总
  • 原文地址:https://www.cnblogs.com/qq-1585047819/p/11552209.html
Copyright © 2011-2022 走看看