AcWing 171 送禮物(搜尋)

2021-10-04 18:48:29 字數 1138 閱讀 7976

雙向搜尋:將整個需要搜尋的物件分成兩半(在已知初態與終態的時候可以考慮)

原題鏈結

感悟:首先可能會思考動態規劃,但它的時間複雜度是(nv)v太大了,不適合。n比較小,可以考慮爆搜。然後這裡有個非常好的技巧,就是把原資料分成兩半,在通過一些技巧,剪枝,可以有效的降低時間複雜度。

本題思路

先搜尋前 n / 2 的資料,列舉所有可能的重量集合,存入陣列

對所有重量集合排序,從大到小(順序優化),判重(排除冗餘)

在搜尋後一半,列舉所有可能的重量集合,然後當前集合x與前面的陣列中乙個集合y,是得x+y <= m,且x+y是最大的

然後就是到列舉結束輸出最大的x+y

剪枝及優化

accode

#include

#include

using

namespace std;

typedef

long

long ll;

int n, m, k;

int weights[

1<<24]

, g[50]

;int cnt =

0, ans =0;

void

dfs_1

(int u,

int sum)if(

(ll)sum + g[u]

<= m)

dfs_1

(u+1

, sum+g[u]);

dfs_1

(u+1

, sum);}

void

dfs_2

(int u,

int sum)

if(weights[l]

+(ll)sum <= m) ans =

max(ans, weights[l]

+ sum)

;return;}

if(g[u]

+(ll)sum <= m)

dfs_2

(u+1

, g[u]

+sum)

;dfs_2

(u+1

, sum);}

intmain()

ACwing 171 送禮物 雙向搜尋

達達幫翰翰給女生送禮物,翰翰一共準備了n個禮物,其中第i個禮物的重量是g i 達達的力氣很大,他一次可以搬動重量之和不超過w的任意多個物品。達達希望一次搬掉盡量重的一些物品,請你告訴達達在他的力氣範圍內一次效能搬動的最大重量是多少。輸入格式 第一行兩個整數,分別代表w和n。以後n行,每行乙個正整數表...

2401 送禮物 雙向搜尋)

題目描述 作為懲罰,gy被遣送去幫助某神牛給女生送禮物 gy 貌似是個好差事 但是在gy看到禮物之後,他就不這麼認為了。某神牛有n個禮物,且異常沉重,但是gy的力氣也異常的大 b 他一次可以搬動重量和在w w 2 31 1 以下的任意多個物品。gy希望一次搬掉盡量重的一些物品,請你告訴他在他的力氣範...

送禮物 題解

這道題目是到毒瘤題。首先我們至少去l個,所以我們可以把小於l的用單調佇列直接求出。對取l r個。顯而易見的是左右兩端必分別是這個區間的最小值和最大值。我們可以用01分數規劃。不放令結果最後為ans,則有 a j ans j a i ans i ans k 所以我們就可以愉快地分數規劃啦。includ...