fzu2178禮物分配 狀壓 二分

2021-07-10 02:59:36 字數 1114 閱讀 7411

在雙胞胎兄弟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的變...