poj2248 真是個新套路。還有套路剪枝...大到小和判重
#include#includepoj2248#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;
}
送禮物 折半搜尋(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和,決策的數...