翰翰和達達飼養了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。每租用...