挤牛奶

挤牛奶

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
****************************************************************/
原文地址:https://www.cnblogs.com/LJA001162/p/11867859.html