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優化就可以了。還有一種方法,只有一次機會,影響很小,起點終點都做一次最短路,列舉在 用,掃一下邊,每條邊...