1. 程式人生 > >小貓爬山

小貓爬山

空格 urn 叠代加深 class 數據 是否 rain oid ==

題目描述

Freda和rainbow飼養了N只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了(嗚咕>_<)。
Freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為W,而N只小貓的重量分別是C1、C2……CN。當然,每輛纜車上的小貓的重量之和不能超過W。每租用一輛纜車,Freda和rainbow就要付1美元,所以他們想知道,最少需要付多少美元才能把這N只小貓都運送下山?

輸入

第一行包含兩個用空格隔開的整數,N和W。
接下來N行每行一個整數,其中第i+1行的整數表示第i只小貓的重量Ci。

輸出

輸出一個整數,最少需要多少美元,也就是最少需要多少輛纜車。

樣例輸入

5 1996
1
2
1994
12
29

樣例輸出

2

提示

對於100%的數據,1<=N<=18,1<=Ci<=W<=10^8。

第一次學習叠代加深搜索,枚舉所有可能的纜車數量,看是否合理,第一個符合條件的即為最小花費
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int A[20],W[20];
 4 int n,w,flg,dep,sum;
 5 void bfs(int x)
 6 {
 7     if(x==(n+1))
 8     {
 9         flg=true
; 10 return ; 11 } 12 for(int i=1;i<=dep;i++) 13 { 14 if(W[i]+A[x]<=w) 15 { 16 W[i]+=A[x]; 17 bfs(x+1); 18 W[i]-=A[x]; 19 if(flg) return ; 20 } 21 } 22 return ; 23 } 24 int main() 25 { 26 27 scanf("
%d%d",&n,&w); 28 for(int i=1;i<=n;i++) 29 { 30 scanf("%d",&A[i]); 31 sum+=A[i]; 32 } 33 sort(A+1,A+n+1,greater<int>()); 34 for(dep=sum/w;dep<=n;dep++) 35 { 36 memset(W,0,sizeof(W)); 37 bfs(1); 38 if(flg) 39 { 40 printf("%d\n",dep); 41 break; 42 } 43 } 44 return 0; 45 }

小貓爬山