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 }