nyoj 325 zb的生日 01揹包 dfs

2021-08-05 18:31:43 字數 1388 閱讀 4141

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:2 描述

今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加、never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。當他準備把西瓜送給c小加和never的時候,遇到了乙個難題,never和c小加不在一塊住,只能把西瓜分成兩堆給他們,為了對每個人都公平,他想讓兩堆的重量之差最小。每個西瓜的重量已知,你能幫幫他麼?

輸入

多組測試資料(<=1500)。資料以eof結尾

第一行輸入西瓜數量n (1 ≤ n ≤ 20)

第二行有n個數,w1, …, wn (1 ≤ wi ≤ 10000)分別代表每個西瓜的重量

輸出輸出分成兩堆後的質量差

樣例輸入

5

5 8 13 27 14

樣例輸出

3

**ural

思路:

一直tle,看了宇神部落格驚奇的發現,巨集定義的max函式給ac了;本題是把兩堆西瓜平均分使差值最小,有意思的是這個題的價值和重量是乙個概念(相對於普通的01揹包),之後就可已01揹包解決了;

#include #include #define  max(a, b) (a > b? a: b) //真要寫成這樣才給過,自己寫的函式快 

int dp[100010], a[30];

int main()

int v = sum;

sum >>= 1;

for(int i = 0; i < n; i++)

} printf("%d\n", v - dp[sum]*2);

} return 0;

}

思路:加乙個剪枝就過了,n比較小,dfs應該才是正解,畢竟估計一下複雜度,1500*10000*20,;

#include #include #define  max(a, b) (a > b? a: b)

int dp[100010], a[30];

int n, sum = 0, v, maxn;

void dfs(int x, int val)

dfs(x + 1, val + a[x + 1]);

dfs(x + 1, val);

return ;

}int main()

v = sum;

sum >>= 1;

dfs(0, 0);

printf("%d\n", v - maxn*2);

} return 0;

}

nyoj 325 zb的生日(01揹包)

題目鏈結 題目描述 今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加 never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。當他準備把西瓜送給c小加和never的時候,遇到了乙個難題...

NYOJ 325 zb的生日(01揹包模板)

時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加 never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。當他準...

NYOJ325 zb的生日 01揹包,深搜DFS

題目 時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加 never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。...