dfs 二分,雙向dfs

2021-10-04 11:19:52 字數 1103 閱讀 6270

達達幫翰翰給女生送禮物,翰翰一共準備了n個禮物,其中第i個禮物的重量是g[i]。

達達的力氣很大,他一次可以搬動重量之和不超過w的任意多個物品。

達達希望一次搬掉盡量重的一些物品,請你告訴達達在他的力氣範圍內一次效能搬動的最大重量是多少。

輸入格式

第一行兩個整數,分別代表w和n。

以後n行,每行乙個正整數表示g[i]。

輸出格式

僅乙個整數,表示達達在他的力氣範圍內一次效能搬動的最大重量。

資料範圍

1≤n≤46

,1≤w,g[i]≤231−1

輸入樣例:

20 575

4181輸出樣例:

用二分的時候陣列必須是排過序的,這道題資料規模量是46,如果單向dfs肯定會t,那麼雙向bfs先搜出一半的選法,再搜另一半,打表搜左邊的值,次次更新ans,小優化,從大到小列舉重量,去重表,記得判斷大小的時候開longlong。

#include

using

namespace std;

const

int n=46;

int w[n]

;int wei[

1<<26]

;int n,m;

int cnt=1;

int ans=0;

int k;

void

dfs(

int u,

int s)

dfs(u+

1,s);if

((long

long

)s+w[u]

<=m)

}void

dfs2

(int u,

int s)

else

r=mid-1;

} ans=

max(ans,wei[l]

+s);

return;}

dfs2

(u+1

,s);if(

(long

long

)s+w[u]

<=m)

}int

main()

柵欄 二分 dfs 貪心

農夫約翰打算建立乙個柵欄將他的牧場給圍起來,因此他需要一些特定規格的木材。於是農夫約翰到木材店購 買木材。可是木材店老闆說他這裡只剩下少部分大規格的木板了。不過約翰可以購買這些木板,然後切割成他所需 要的規格。而且約翰有一把神奇的鋸子,用它來鋸木板,不會產生任何損失,也就是說長度為10的木板可以切成...

柵欄的木料(二分 dfs)

題目描述 description 農民john準備建乙個柵欄來圍住他的牧場。他已經確定了柵欄的形狀,但是他在木料方面有些問題。當地的雜貨儲存商扔給john一些木板,而john必須從這些木板中找出盡可能多所需的木料。當然,john可以切木板。因此,乙個9英呎的木板可以切成乙個5英呎和乙個4英呎的木料 ...

bzoj 1082 柵欄(二分 DFS)

傳送門biu 先排序,二分最多能得到多少木板,顯然要盡量選小的木板,當木材大小小於最小的木塊時丟棄。記錄當前丟棄的木材量,若加上mid塊木板 所有的木材 則不合法。includeusing namespace std int m,n,mid bool flag int a 55 sa,b 1005 ...