标题
分配宝藏
类别
综合
时间限制
2S
内存限制
256Kb
问题描述
两个寻宝者找到一个宝藏,里面包含n件物品,每件物品的价值分别是W[0],W[1],…W[n-1]。
SumA代表寻宝者A所获物品价值总和,SumB代表寻宝者B所获物品价值总和,请问怎么分配才能使得两人所获物品价值总和差距最小,即两人所获物品价值总和之差的绝对值|SumA - SumB|最小。
输入说明
输入数据由两行构成:
第一行为一个正整数n,表示物品个数,其中0<n<=200。
第二行有n个正整数,分别代表每件物品的价值W[i],其中0<W[i]<=200。
输出说明
对于每组数据,输出一个整数|SumA-SumB|,表示两人所获物品价值总和之差的最小值。
输入样例
4
1 2 3 4
输出样例
0
#include<math.h>
#include<stdio.h>
int dp[201][20001] = { 0 };
int v_w[201] = { 0 };
int sum = 0;
int item[201];
//
//void findWhat(int i, int j)
//{ //最优解情况
// if (i >= 0)
// {
// if (dp[i][j] == dp[i - 1][j])
// {
// item[i] = 0;
// findWhat(i - 1, j);
// }
// else if (j - v_w[i] >= 0 && dp[i][j] == dp[i - 1][j - v_w[i]] + v_w[i])
// {
// item[i] = 1;
// findWhat(i - 1, j - v_w[i]);
// }
// }
//}
int main()
{
int n = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &v_w[i]);
sum += v_w[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= sum / 2; j++)
{
if (v_w[i] > j)
{
dp[i][j] = dp[i - 1][j];
}
else
{
dp[i][j] = dp[i - 1][j] > dp[i - 1][j - v_w[i]] + v_w[i] ? dp[i - 1][j] : dp[i - 1][j - v_w[i]] + v_w[i];
}
}
}
int ret = fabs(2 * dp[n][sum / 2] - sum);
printf("%d\n", ret);
//findWhat(n, sum / 2);
//for (int i = 1; i <= n; i++)
//{
// printf("%d ", item[i]);
//}
return 0;
}