codevs 4228 小貓爬山

2021-08-17 23:13:17 字數 1224 閱讀 7717

4228 小貓爬山

題目描述 

description

freda和rainbow飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了(嗚咕》_<)。

freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1、c2……cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,freda和rainbow就要付1美元,所以他們想知道,最少需要付多少美元才能把這n只小貓都運送下山?

輸入描述 

input description

第一行包含兩個用空格隔開的整數,n和w。

接下來n行每行乙個整數,其中第i+1行的整數表示第i只小貓的重量c 

i。輸出描述 

output description

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

樣例輸入 

sample input

5 199612

1994

1229

樣例輸出 

sample output

2資料範圍及提示 

data size & hint

對於100%的資料,1<=n<=18,1<=c 

i <=w<=10^8。

題解:用dfs(now,cnt),遍歷前面的每個纜車如果能放進去就dfs(now+1,cnt),然後考慮新開乙個纜車dfs(now+1,cnt+1),裸的2^18直接搜尋會t,所以需要剪枝,首先可以知道如果當前遍歷的纜車數已經超過貓的數量的時候一定是錯答案,其次可以先將貓的重量按從大到小排序,因為重量越大越容易判斷太重了的情況。

ac**:

#include using namespace std;

const int maxn=20;

#define _for(i,a,b) for(int i=a;i<=b;i++)

int n,m,a[maxn],b[maxn],ans;

void dfs(int x,int y)

if(y>=ans)return ;

for(int i=1;i<=y;i++) }

b[y+1]=a[x];

dfs(x+1,y+1);

b[y+1]=0;

}int main(int argc, char const *argv)

小貓爬山(dfs)

時間限制 1 sec 記憶體限制 128 mb 題目描述 freda和rainbow飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分...

小貓爬山(搜尋)

題目描述 freda和rainbow飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重...

AcWing 小貓爬山

翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...