要求從n件物品中選出若干件,重量之和不超過w並且最接近w,由於有45件最多,所以o(2^n)時間複雜度過高,可以考慮減半先搜尋出結果,用另一半在前一半中二分尋找,
最終拼成結果,時間複雜度約為o(2^n/2*n)。中間有乙個優化是將所有物品的重量進行降序排序,這樣做可以使得子集和更快的趨近w和,決策的數量將會變少。
**:
#include#include#include
#include
using
namespace
std;
#define maxn 100typedef
long
long
ll;unsigned
intn,w,g[maxn];
vector
int >v;
unsigned
intans;
intm ;
void dfs1(int now,unsigned int tot)
dfs1(now-1,tot);//
不選第i件,
if(g[now]+tot <= w)dfs1(now-1,g[now]+tot);
}void dfs2(int now,unsigned int
tot)
dfs2(now+1
,tot);
if(g[now]+tot <= w)dfs2(now+1,g[now]+tot);
}bool cmp(unsigned int &a,unsigned int &b)
intmain()
演算法競賽高階指南 0x00
快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...
《演算法競賽高階指南》0x32約數
求解 1,n 之間的最大的反素數,有性質 這個反素數是質因數個數最多的數中最小的乙個。證明 假設有乙個數質因數個數比它多,如果在他前面,不滿足反素數的定義,如果在他後面,一定可以找到第乙個質因數比它大的數,這個數作為結果更好,反證可知,這個數質因數一定是最多的 反證 假設有質因數與他的個數一樣但是比...
演算法競賽高階指南 0x11 棧 Editor
通過觀察我們可以將這個序列通過2個棧和2個陣列來維護5種操作進而達到題解,為了方便,直接用陣列來模擬棧 stkl n 游標左邊的棧 stkr n 游標右邊的棧 tl 左棧指標 tr 右棧指標 s n 字首和陣列 f n 最大字首和 對於第乙個操作,在游標處插入x,就是給stkl 的棧頂插入乙個x,字...