zoukankan      html  css  js  c++  java
  • P3052 [USACO12MAR]【摩天大楼里的奶牛(Cows in a Skyscraper)】

    描述

      N头牛在楼顶,需要坐电梯下来,电梯最大承载量为W,牛 i 的重量为C_i 。

    题目

      怎样安排,才能电梯上下的次数最少,而使所有的牛下来。

    输入输出格式

    输入

      第一行给出奶牛头数N,及电梯的容量W.接下来N行给出每个奶牛的重量
      1 <= N <= 18   1 <= W <= 100,000,000 ,1<=Ci<=W

    输出

      电梯上下的次数R 

    输入输出样例

    输入样例1

    4 10 
    5 
    6 
    3 
    7 
    

    输出样例1

    3 
    //第一次运1, 3这两头牛 
    //第二次运2这一头牛 
    //第三次运4这一头牛 
    

    解题思路

      这道题我仍然用的DFS的记忆化搜索,a数组是每个电梯的剩余载重,b数组是每头牛的重量,我以奶牛为深度,sum记已开电梯数量,每次搜索时,找已用的电梯,如果能塞就塞进去,最后再重新开一个电梯塞进去,并随时比较剪枝,输出最优解。

    题解

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,w,ans=9999;
     4 int a[20];
     5 int b[20];
     6 void dfs(int dep,int sum)
     7 {
     8     if(sum>=ans)
     9     {
    10         return;
    11     }
    12     if(dep==n+1)
    13     {
    14         ans=sum;
    15         return;
    16     }
    17     for(int i=1;i<=sum;i++)
    18     {
    19         if(a[i]>=b[dep])
    20         {
    21             a[i]-=b[dep];
    22             dfs(dep+1,sum);
    23             a[i]+=b[dep];
    24         }
    25     }
    26         a[sum+1]-=b[dep];
    27         dfs(dep+1,sum+1);
    28         a[sum+1]+=b[dep];
    29 }
    30 int main()
    31 {
    32     cin>>n>>w;
    33     for(int i=1;i<=n;i++)
    34     {
    35         a[i]=w;
    36     }
    37     for(int i=1;i<=n;i++)
    38     {
    39         
    40         cin>>b[i];
    41     }
    42     dfs(1,1);
    43     cout<<ans;
    44 }
  • 相关阅读:
    原来是板子的硬件问题
    最简单的helloworld模块编译加载(linux3.5内核源码树建立)
    排序学习笔记
    配置开发环境遇到的一些问题及解决方法
    .NET基础之GridView控件
    .NET之页面数据缓存
    .NET基础之Calendar控件
    【转帖】DIV+CSS完美兼容IE6/IE7/FF的通用方法
    ADO.NET()Command
    .NET基础之DataList控件
  • 原文地址:https://www.cnblogs.com/hualian/p/11155648.html
Copyright © 2011-2022 走看看