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 }
原文地址:https://www.cnblogs.com/hualian/p/11155648.html