题目地址:http://ac.jobdu.com/problem.php?pid=1420
-
题目描述:
-
Jobdu团队有俩PPMM,这俩MM干啥都想一样。一天,富强公司给团队赞助了一批水果,胡老板就把水果派发给了这俩MM,由她们自行分配。每个水果都有一个重量,你能告诉她们怎么分才使得分得的重量差值最小吗?
-
输入:
-
输入有多组数据,每组数据第一行输入水果个数n(1<=n<=100),接下来一行输入n个重量wi(0<=wi<=10^5)。
-
输出:
-
对每组输入输出一行,输出可以得到的最小差值。
-
样例输入:
-
510 20 30 10 10
-
样例输出:
-
0
0/1背包解法:
//题目地址:http://ac.jobdu.com/problem.php?pid=1420
#include <stdio.h>
#include <string.h>
#define Max(a, b) (a > b)?(a):(b);
int n, sum;
int fruit[100];
int dp[5000001];
int MinDiff(){
int i, j;
int first, second, ans;
int half = (sum >> 1);
memset(dp, 0, sizeof(dp));
for (i = 0; i < n; ++i){
for (j = half; j >= fruit[i]; --j){
dp[j] = Max(dp[j], dp[j-fruit[i]] + fruit[i]);
}
}
return sum - 2 * dp[half];
}
int main(int argc, char *argv[]) {
int i;
while (scanf("%d", &n) != EOF){
sum = 0;
for (i = 0; i < n; ++i){
scanf("%d", &fruit[i]);
sum += fruit[i];
}
printf("%d\n", MinDiff());
}
return 0;
}
/**************************************************************
Problem: 1420
User: 简简单单Plus
Language: C
Result: Accepted
Time:1170 ms
Memory:20444 kb
****************************************************************/
深度优先搜索解法:
#include <stdio.h>
#include <string.h>
int n, k, fruit[100], used[100], total, half;
void dfs(int x, int y) {
int i;
if (y > half) return;
if (y > k) k = y;
if (k == half) return;
for (i = x; i < n; i++)
if (!used[i]) {
used[i] = 1;
dfs(i + 1, y + fruit[i]);
used[i] = 0;
}
}
int main() {
int i;
while(scanf("%d",&n) != EOF) {
total = 0;
for(i = 0;i < n; i++) {
scanf("%d", &fruit[i]);
total += fruit[i];
}
k = -1;
half = total >> 1;
memset(used, 0, sizeof(used));
dfs(0, 0);
printf("%d\n", total- k * 2);
}
return 0;
}
/**************************************************************
Problem: 1420
User: 简简单单Plus
Language: C
Result: Accepted
Time:50 ms
Memory:916 kb
****************************************************************/