小貓爬山(dfs)

2021-09-03 01:26:18 字數 1699 閱讀 1453

時間限制: 1 sec  記憶體限制: 128 mb

題目描述

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

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

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

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

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

複製樣例資料

5 199612

1994

1229

樣例輸出

2
提示

對於100%的資料,1<=n<=18,1<=ci<=w<=10^8。

最近也不知道怎麼了,不在狀態,這種dfs都弄了很久,還是看別人的,下面附上我超時的**,難受,我是列舉每個重量,其實只要列舉次數就行了。

/**/

#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;

using namespace std;

int n, w, a[20];

int vis[20], ans = 20;

int sum = 0;

bool cmp(int x, int y)

void dfs(int num, int sum, int cnt, int tot)

int f = 0;

for (int i = 1; i <= n; i++)

f = 1;

dfs(num + 1, sum + a[i], cnt, tot + a[i]);

vis[i] = 0;

} if(!f && cnt + ceil(1.0 * (sum - tot) / w) < ans) dfs(num, 0, cnt + 1, tot);

}int main()

sort(a + 1, a + n + 1, cmp);

dfs(0, 0, 0, 0);

printf("%d\n", ans + 1);

return 0;

}/**/

這是正確的**

/**/

#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;

using namespace std;

int n, w;

int a[20], p[20], sum, f;

void dfs(int n, int num)

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

int main()

} return 0;

}/**/

小貓爬山 dfs 剪枝

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

小貓爬山(DFS深搜)

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

ACWING165 小貓爬山(dfs)

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