在雙胞胎兄弟eric與r.w的生日會上,他們共收到了n個禮物,生日過後他們決定分配這n個禮物(numv+numw=n)。對於每個禮物他們倆有著各自心中的價值vi和wi,他們要求各自分到的禮物數目|numv-numw|<=1,並且各自所衡量的禮物價值的差值|sumv-sumw|盡可能小,現在他們想知道最小的差值是多少。
第一行為乙個整數表示資料組數t。 接下來t組陣列,每組資料第一行為乙個整數n。(n<=30) 第二行有n個整數,表示eric所衡量的每個禮物的價值vi。(1<=vi<=10000000) 第三行也有n個整數,表示r.w所衡量的每個禮物的價值wi。(1<=wi<=10000000)
對於每組資料,輸出最小的差值。
131 2 34 2 1
1思路:這題一開始比較容易想到的是把所有狀態都列舉一遍,但是這樣的複雜度為2^30次,穩穩的超時了。所以我們可以把n件物品拆成兩半,前一半的個數為n/2,後一半的個數為n-n/2。然後我們先預處理出前一半的狀態,用c[i][j]表示前一半有i件物品給eric的第j種情況sumv-sumw的值。然後對於每乙個i,0<=i<=n/2,我們進行從小到大排序,這裡的排序是為了之後的二分。接著,我們就可以處理後一半了,列舉後一半的所有狀態(0~(1<
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define maxn 100050
#define inf 999999999
int v[40],w[40];
int c[17][1<<16],d[17];
int chazhao(int num,int sum)
else
minx=min(minx,abs(c[num][t]-sum));
if(p2!=d[num])
}return minx;
}int main()
for(i=1;i<=n;i++)
m1=n/2;
m2=n-m1;
memset(d,0,sizeof(d));
for(state=0;state<(1<
qwb與李主席 狀壓 二分
description qwb和李主席打算平分一堆寶藏,他們想確保分配公平,可惜他們都太懶了,你能幫助他們嘛?input 輸入包含多組測試資料,處理到檔案結束。每組測試資料的第一行是乙個正整數n 0 n 36 表示物品的總個數.接下來輸入n個浮點數 最多精確到分 表示每個物品的價值v 0 v 1e9...
2018 10 05 校內模擬 二分 狀壓 樹剖
t1 階乘 fact.cpp 問題描述 有 n個正整數 a i 設它們乘積為 p,你可以給 p乘上乙個正整數 q,使 p q剛好為正 整數m的階乘,求m的最小值。輸入 共兩行。第一行乙個正整數n。第二行n個正整數a i 輸出 共一行乙個正整數m。輸入樣例 16 輸出樣例 3樣例解釋 當p 6,q 1...
HDU 3681 bfs 狀壓dp 二分
題目 click 題意 給定乙個n m的地圖,d表示不能走的地方,g補充滿能量,問從f點走完所有的y點最小的能量,走乙個消耗一格能量。注意一下題目中所給的範圍,y g的數量不超過15。在無數條路徑中找出一條最佳路徑,d是不能走的,所需點的數量頂多16個 加上了f點 其實可以發現本質就是乙個tsp的變...