JZOJ 平衡的子集

2021-08-22 10:24:35 字數 1324 閱讀 9552

description

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

input

第一行乙個整數n,表示人數。

接下來n行,每行乙個整數m(i)

output

輸出一行乙個整數,表示一共多少種選法。

sample input

4 1

2 3

4sample output

3 樣例解釋:

第一種選出,分成和兩組;

第二種選出,分成和兩組;

第三種選出,分成和兩組。

data constraint

40%的資料滿足:1<=m(i)<=1000;

對於100%的資料滿足:2<=n<=20,1<=m(i)<=100000000

折半搜尋,先從1搜到n/2,每個有選到a組,選到b組,不選三種選擇,最後將總和與狀態記下來,n/2+1 ~ n搜一遍同樣操作,最後排個序統計答案。

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 25;

typedef

long

long ll;

struct datadata1[1

<<20],data2[1

<<20];

int a[maxn],n,k,cnt1,cnt2,ans;

bool vis[(1

<<20)+2000];

inline

void dfs1(int x,int sum,int s)

dfs1(x+1,sum+a[x],s+(1

<<(n-x)));

dfs1(x+1,sum-a[x],s+(1

<<(n-x)));

dfs1(x+1,sum,s);

}inline

void dfs2(int x,int sum,int s)

dfs2(x+1,sum+a[x],s+(1

<<(n-x)));

dfs2(x+1,sum-a[x],s+(1

<<(n-x)));

dfs2(x+1,sum,s);

}inline

bool cmp(data a,data b)

i=r1,j=r2;

}}cout

<1

0;}

JZOJ4841 平衡的子集

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

Jzoj4841 平衡的子集

夏令營有n個人,每個人的力氣為m i 請大家從這n個人中選出若干人,如果這些人可以分成兩組且兩組力氣之和完全相等,則稱為乙個合法的選法,問有多少種合法的選法?這道題我們拷打資料範圍後知道應該是折半搜尋了 但是似乎不是那麼好做 我們考慮如何搜尋,顯然每個人有三種狀態,在隊伍1中,在隊伍2中和沒有被選入...

jzoj4597 現世斬 平衡樹 set

給出有權無向連通圖,有一次機會使與乙個點相連的邊的權變為一,求最短路。顯然的想法是學習gdoi2016的一題,分層單源最短路,設f i 0,2 表示沒有用機會,在前驅用機會,沒有機會,dijset優化就可以了。還有一種方法,只有一次機會,影響很小,起點終點都做一次最短路,列舉在 用,掃一下邊,每條邊...