ACWing 165 小貓爬山 DFS剪枝

2021-10-10 10:20:25 字數 1437 閱讀 9530

翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。

經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了(嗚咕》_<)。

翰翰和達達只好花錢讓它們坐索道下山。

索道上的纜車最大承重量為w,而n只小貓的重量分別是c1、c2……cn。

當然,每輛纜車上的小貓的重量之和不能超過w。

每租用一輛纜車,翰翰和達達就要付1美元,所以他們想知道,最少需要付多少美元才能把這n只小貓都運送下山?

輸入格式

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

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

輸出格式

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

資料範圍

1≤n≤18,

1≤ci≤w≤108

輸入樣例:

5 199612

1994

1229

輸出樣例:
2
首先分析這道題,有點像貪心,但是用搜尋解決要更簡單一些,首先需要準備的工作如下:

乙個陣列「cat」, 用於存放妹紙小貓的體重

乙個陣列「car」, 表示每輛纜車,元素的值表示對應纜車內放置的小貓的體重(載客量)

為了方便,這裡我用容器表示陣列,實現對纜車選擇的動態模擬,同時可以減少使用的狀態變數數目

變數ans:用於記錄最少需要的纜車數目

變數n, w:按題目要求讀入的量

接下來分析解題的思路,本題主要關注的狀態量有:已經運送的小貓共多少只,已經租用多少輛纜車,每輛車的當前載重量,深搜的執行分析如下:

對於本體的搜尋,引數只需要傳入當前的小貓編號即可

從遞迴的角度考慮,在每次遞迴開始時需要對遞迴終止的條件進行判斷,當小貓編號與總數量相等時,對最少需要的纜車數進行更新;

遍歷每輛纜車,尋找能放下小貓的纜車。如果能放入,遞迴進行下乙隻小貓,此處記得恢復現場

剪枝優化:本體的剪枝優化思路相對比較簡單,只需要在每次遞迴開始判斷一下當前的方案是否比之前的方案更優,如果不就直接放棄這種方案return掉

#include #include #include using namespace std;

int n = 0, w = 0, ans = 0;

int *cat;

vectorcar;

bool cmp(const int & a, const int & b)

void dfs(int now)

for(int i = 0; i < car.size(); i++)

}car.push_back(cat[now]);

dfs(now + 1);

car.pop_back();

}int main()

Acwing 165 小貓爬山

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

acwing165 小貓爬山

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

Acwing 165 小貓爬山

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