雙向搜尋:將整個需要搜尋的物件分成兩半(在已知初態與終態的時候可以考慮)
原題鏈結
感悟:首先可能會思考動態規劃,但它的時間複雜度是(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...