165 小貓爬山 (DFS 狀壓DP)

2021-09-26 01:54:06 字數 1465 閱讀 2534

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

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

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

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

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

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

輸入格式

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

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

輸出格式

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

資料範圍

1≤n≤181≤n≤18,

1≤ci≤w≤1081≤ci≤w≤108

輸入樣例:

5 199612

1994

1229

輸出樣例:

2
狀態壓縮dp

orz! daolao的部落格如下

#include #include #include using namespace std;

int n, w[19], f[20][1<<19], w;

int main()

}if( f[i][(1把這些貓裝到纜車裡,纜車有重量限制。

每只貓有兩種決策,裝到已有的車中,新開一輛車來裝它。

排序先選重量大的貓,這樣後邊的貓的決策就少了,讓搜尋樹靠近根節點的分支就減少了。

#include#define ll long long

#define ull unsigned long long

#define maxn (ll)1e5

#define inf 0x3f3f3f3f

#define inf 0x7fffffff

#define pi acos(-1.0)

#define pb push_back

#define re register

const double eps = 0.0000001;

using namespace std;

typedef pairpii;

inline ll sgn(double x)

ll ans[maxn],n,m;

ll f[maxn];

ll res = inf;

void dfs(ll idx,int num)

for(int i = 0;i>n>>m;

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

sort(ans+1,ans+n+1,greater());//從大到小排序,優先選擇決策少的

dfs(1,0);

cout<}

ACWING165 小貓爬山(dfs)

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

Acwing165 DFS 小貓爬山

165.小貓爬山 acwing題庫 題解 因為 n nn 很小,所以我們可以暴力列舉所有情況 那麼,我們要考慮的問題是搜尋的順序,dfs函式的引數 搜尋的順序 對於每個小貓,我們有兩種決策 如果當前的車超重,把它放到新的車中 函式引數 對於引數,定義dfs int u int k 保證了所有情況都可...

ACWing 165 小貓爬山 DFS剪枝

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