0x22 迭代加深

2022-04-30 01:06:18 字數 1866 閱讀 3926

poj2248 真是個新套路。還有套路剪枝...大到小和判重

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,d,x[110];bool bk,v[110][110

];void dfs(int

k)

memset(v[k],

false,sizeof

(v[k]));

for(int i=k-1;i>=1;i--)}}

}int

main()

}return0;

}

poj2248

送禮物 折半搜尋(orz cgh隊長之前教我),書上叫雙向搜尋。又雙叒叕有套路剪枝...大到小和很明顯的可行性。結果dfs時居然還要先嘗試選再嘗試不選。。無語

#include#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int n;int w,c[110

];bool cmp(int x,int y)

int len;int a[10001000

];inline

void dfs(int k,int

d)

if(((ll)d)+c[k]<=w)dfs(k+1,d+c[k]);

dfs(k+1

,d);

}int

mmax;

int erfen(int

k)

else r=mid-1

; }

return

ans;

}inline

void dfs2(int k,int

d)

if(((ll)d)+c[k]<=w)dfs2(k+1,d+c[k]);

dfs2(k+1

,d);

}int

main()

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int n;int w,c[110

];bool cmp(int x,int y)

int len;int a[10001000

];inline

void dfs(int k,int

d)

if(((ll)d)+c[k]<=w)dfs(k+1,d+c[k]);

dfs(k+1

,d);

}int

mmax;

int erfen(int

k)

else r=mid-1

; }

return

ans;

}inline

void dfs2(int k,int

d)

if(((ll)d)+c[k]<=w)dfs2(k+1,d+c[k]);

dfs2(k+1

,d);

}int

main()

送禮物

《演算法競賽高階指南》0x22dfs 小貓爬山

首先看到這個資料範圍就知道需要用搜尋來實現,儲存的當前狀態是一共用了多少纜車,當前掃瞄的小貓編號 每個纜車中的重量。其中第三個狀態是可以用全域性陣列來維護的,前面兩個狀態作為dfs的引數傳入,每次可以產生cnt 1個分支,cnt為纜車數量。優先排重量比較大的,因為在搜尋樹的深處大的重量更難搜尋到最優...

《演算法競賽高階指南》0x24迭代加深 子集和問題

要求從n件物品中選出若干件,重量之和不超過w並且最接近w,由於有45件最多,所以o 2 n 時間複雜度過高,可以考慮減半先搜尋出結果,用另一半在前一半中二分尋找,最終拼成結果,時間複雜度約為o 2 n 2 n 中間有乙個優化是將所有物品的重量進行降序排序,這樣做可以使得子集和更快的趨近w和,決策的數...