挤牛奶
挤牛奶
Description
小卡卡终于帮农夫John找到了走丢的那一头奶牛,John为了感谢小卡卡,不仅告诉了他在 Pascal山脉上可能存在Pascal圣地最大的宝藏,还说要请小卡卡喝牛奶。可是农夫John发现他家里所储藏的牛奶已经喝光了,所以要临时给奶牛挤奶。小卡卡实在是太好心了,说要帮农夫John一起挤牛奶。John答应了,他把他的n头奶牛中的n/2头(n是个偶数)分给小卡卡挤,他自己挤剩下的n/2头奶牛。但是每一头奶牛都有不同的产奶量,农夫John为了让小卡卡减轻负担,他希望他们两个所挤的牛奶的总量之差最小。小卡卡得知了每头奶牛的产奶情况之后很快就解决了这个问题。
Input
测试数据第一行一个整数n,n为偶数且小于100。表示有n头奶牛。第二行n个整数分别给出每头奶牛的产奶量(产奶量的总和不超过2000)。
Output
输出小卡卡和农夫所挤的牛奶量的最小差值。
Sample Input
6
7 9 2 6 4 2
Sample Output
0
HINT
Source
#include<bits/stdc++.h>
using namespace std;
bool f[101][2001];
int n,a[101];
int abbs(int x,int y)
{
if(x-y>0) return x-y;
else return y-x;
}
int main()
{
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=n;j>=0;j--)
for(int k=2000;k>=0;k--)
if(f[j][k]==1)
f[j+1][k+a[i]]=1;
int ans=sum;
for(int i=0;i<=sum;i++)
if(f[n/2][i]==1)
{
if(ans>abbs(i,sum-i))
{
ans=abbs(i,sum-i);
}
}
cout<<ans<<endl;
return 0;
}
/**************************************************************
Problem: 1608
User: LJA001162
Language: C++
Result: 正确
Time:40 ms
Memory:1736 kb
****************************************************************/