PID72 / 拔河比赛 (动态规划)
http://www.rqnoj.cn/problem/72
题目描述
superwyh的学校要举行拔河比赛,为了在赛前锻炼大家,老师决定把班里所有人分为两拨,进行拔河因为为锻炼所以为了避免其中一方的实力过强老师决定以体重来划分队伍,尽
量保持两个队伍的体重差最少,因为老师对结果没兴趣,所以只告诉老师最小的体重差是多少就行了。这个受苦受累的任务就交给superwyh了,因为这两天superwyh的后背间谍sjh
闹肚子了,所以只好superwyh亲自去调查每个人的体重,但是仅仅知道体重依然难以确定到底如何分配队伍,请各位oier帮助superwyh出出主意。
输入格式
第一行为人数(1<=n<=100),从第二行开始是每个人的体重(0<=m<=100)。
输出格式
最小体重差。
样例输入
4
10
23
41
12
样例输出
4
解题思路:
要尽量把两边的人的体重均匀分布,就是让一边的人的重量接近总重量的一半,即容量为总重量一半的01背包问题。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define N 10020
int dp[N], a[N];
int main()
{
int n, sum, i, j, m;
scanf("%d", &n);
sum=0;
for(i=1; i<=n; i++)
{
scanf("%d", &a[i]);
sum+=a[i];
}
m=(sum+1)/2;
for(i=1; i<=n; i++)
{
for(j=m; j>=a[i]; j--)
dp[j]=max(dp[j], dp[j-a[i]]+a[i]);
}
printf("%d\n", abs(sum-2*dp[m]));
return 0;
}