HELP!动态规划求解

约翰有N(1<=N<-40)只奶牛,每只奶牛的产奶量ME(1<-Mi<-100)都不一定一样。约翰想从她们中挑出2部
分,使得每部分的产奶量之和相等,并且这个和要尽可能的大。但是这是一项复杂的操作。

输入
第一行一个数N表示奶牛的个数;后面的N行每行一个数字表示奶牛的产奶量。

输出仅一行,每部分产奶量的最大值。
输入例子:
6
1
2
39
6
10
7
输出:13

如果您想实现这个问题的代码,可以使用背包问题的思路。

您可以将每一个奶牛看作是一件物品,物品的价值为该奶牛的产奶量,物品的重量为该奶牛的产奶量,背包的容量为奶牛数量总和的一半。

然后,您可以使用01背包问题的代码来求出最大的价值,这就是每一部分的最大产奶量。

#include <bits/stdc++.h>
using namespace std;
const int N = 45;
int n,m,a[N];
int f[N][10005];
int main() {
    cin>>n;
    m=0;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
        m+=a[i];
    }
    memset(f,0,sizeof f);
    f[0][0]=1;
    for (int i=1;i<=n;i++) {
        for (int j=m/2;j>=0;j--) {
            for (int k=0;k<=j&&k<=a[i];k++) {
                f[j][i]=max(f[j][i],f[j-k][i-1]);
            }
        }
    }
    int ans=0;
    for (int i=0;i<=m/2;i++) {
        if (f[i][n]) {
            ans=m-2*i;
            break;
        }
    }
    cout<<ans<<endl;
    return 0;
}