時間限制:
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)分別代表每個西瓜的重量
輸出輸出分成兩堆後的質量差
樣例輸入
55 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立刻下定決心買了一堆西瓜。...