描述
小卡卡终于帮农夫John找到了走丢的那一头奶牛,John为了感谢小卡卡,不仅告诉了他在Pascal山脉上可能存在Pascal圣地最大的宝藏,还说要请小卡卡喝牛奶。
可是农夫John发现他家里所储藏的牛奶已经喝光了,所以要临时给奶牛挤奶。小卡卡实在是太好心了,说要帮农夫John一起挤牛奶。John答应了,他把他的n头奶牛中的n/2头(n是个偶数)分给小卡卡挤,他自己挤剩下的n/2头奶牛。但是每一头奶牛都有不同的产奶量,农夫John为了让小卡卡减轻负担,他希望,他们两个所挤的牛奶的总量之差最小。
小卡卡得知了每头奶牛的产奶情况之后很快就解决了这个问题。
输入
该题含有多组测试数据。
每组测试数据第一行一个整数n,n为偶数且小于100。表示有n头奶牛。
第二行n个整数分别给出每头奶牛的产奶量(产奶量的总和不超过2000)。
输出
输出小卡卡和农夫所挤的牛奶量的最小差值。
样例输入
6
7 9 2 6 4 2
样例输出
0
【参考程序】:
#include<iostream>
#include<cstring>
using namespace std;
bool bag[51][1001];
int m[101],a[101];
int n;
int main()
{
while (scanf("%d",&n)!=EOF)
{
int sum=0;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
memset(bag,false,sizeof(bag));
bag[0][0]=true;
memset(m,0,sizeof(m));
for (int i=1;i<=n;i++)
for (int j=min(i,n>>1);j>=1;j--)//最大奶牛数为n/2
for (int k=min(m[j-1]+a[i],sum>>1);k>=a[i];k--)
{//最大挤奶重量是sum/2
bag[j][k]|=bag[j-1][k-a[i]];
if (bag[j][k] && m[j]<k) m[j]=k;
}//同样满足的取最能填的物品,因为可以使结果相差更小
for (int i=sum>>1;i>=0;i--)
if (bag[n>>1][i])
{
printf("%d\n",sum-(2*i));
break;
}
}
return 0;
}