Jzoj4841 平衡的子集

2021-08-10 01:20:23 字數 1071 閱讀 2751

夏令營有n個人,每個人的力氣為m(i)。請大家從這n個人中選出若干人,如果這些人可以分成兩組且兩組力氣之和完全相等,則稱為乙個合法的選法,問有多少種合法的選法?

這道題我們拷打資料範圍後知道應該是折半搜尋了

但是似乎不是那麼好做

我們考慮如何搜尋,顯然每個人有三種狀態,在隊伍1中,在隊伍2中和沒有被選入

我們將所有可能的狀態都搜尋出來加入乙個資料結構(按照隊伍1-隊伍2的力量之差p作為關鍵字)

但是這樣做是有問題的,很多情況下會重複計算

例如,四個人m為1 1 1 1,折半搜尋以後,我們會得到以下幾個狀態,其中有兩種可能的情況

1.兩種狀態所選人物完全相同但因為分配方法不同導致p不相同

2.兩種狀態所選人物不同但是因為分配方法導致p相同

所以我們不能簡單記錄選了哪些人或者是這些人的p是多少而是兩者都要計算

所以我們可以考慮用map套set(乙個p和乙個k對應了一種選人的方法)

map的第一維表示的是p,每個節點都是乙個set儲存乙個二進位制的選人方案k(1表示選擇,0表示不選)

這樣的話在第二次搜尋時,我們將值為-p的那個set拿出來,遍歷其中每乙個節點,在全域性開乙個陣列vs表示某種選人的方式是否合法

最後統計答案即可

注:本題正解應為hash表

#pragma gcc optimize("o3")

#pragma g++ optimize("o3")

#include

#include

#include

#include

#include

using

namespace

std;

map > s;

set vis[1024],q;

int n,v[30],m,ans=0;

bool vs[1

<<20];

void dfs(int x,int p,int k)

}void dgs(int x,int p,int k)

return;

} else

}int main()

JZOJ4841 平衡的子集

有n個人,每個人的力氣為m i 從這n個人中選出若干人,如果這些人可以分成兩組且兩組力氣之和完全相等,則稱為乙個合法的選法,問有多少種合法的選法?請注意這裡是選人的方案而不是分組的方案。我們考慮暴力,時間複雜度o 320 顯然不能接受。我們假設分進某一組權wi 為 1或1,不選為0,那麼每個人和的貢...

洛谷4841 城市規劃

題意 求 n 個點的簡單 無重邊無自環 有標號無向連通圖數目。思路 設 f n 為點數為 n 的無向連通圖的數量,g n 為點數為 n 的無向圖的數量,可以知道 g n 2 可以這麼理解,n 個點中取兩個點連邊,一共有 c n 2 種,每個邊存在連或不連兩種可能。同時有 g n sum nc f i...

HDU 4841 圓桌問題

acm模版 這個題簡單的來就是暴力列舉約瑟夫環,當然,太暴力也不好,適當的用資料結構優化一下也是有必要的,這裡用向量維護,成功水過。include include include include include using namespace std const int maxn 4e4 const...