acwing165 小貓爬山

2021-10-09 05:42:17 字數 1420 閱讀 8181

做題心得acwing165.小貓爬山

題目翰翰和達達飼養了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

解題思路

有點像揹包問題,但是n的資料範圍不大,但是w的資料範圍很大,可以進行暴力搜尋dfs,dfs的順序:對每乙隻小貓,進行兩種決策,

1.將小貓挨個放入已經存在的車

2.用乙個新車 將小貓放入

但是這樣會超時 要進行相應的剪枝。

一些剪枝策略:

1.優化搜尋順序

優先搜尋決策少的節點

2.排除冗雜的資訊

就是排除重複

3.可行性剪枝

對於不可行的節點進行刪除跳過處理

4.最優性剪枝

尋找最優解

5.記憶化

其實就是dp

對於這道題,第乙個剪枝策略,可以應用。首先對於重量大的貓 我們需要的車的要求更高,而反之我們對於車的需求則更低,所以我們可以對小貓進行大到小的排序,再進行遍歷。

第二個方法,小貓其實並無重複。

第三個方法可以應用,如果當前所需要的車已經大於我們上乙個解,那麼我們就不再需要這個解,直接返回就行了。

那麼我們的優化也就可以了。接下來放**

#include #include using namespace std;

const int n=20;

int n,m,ans=n;

int cat[n],che[n];//貓的重量和車的已經裝的重量

void dfs(int now,int k)

for(int i=1;i<=k;i++)//對於乙隻貓 遍歷每一輛車

}che[k+1]=cat[now];//如果不能進入的話

dfs(now+1,k+1);

che[k+1]=0;

}int main()

sort(cat+1,cat+n+1);

reverse(cat+1,cat+n+1);//優化1.從大到小排序

dfs(1,0);

cout《一道不太困難的dfs,主要難度在於優化和順序的選擇,如何讓每一種情況都實現。

Acwing 165 小貓爬山

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

Acwing 165 小貓爬山

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

ACWING165 小貓爬山(dfs)

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