约翰有N(1<=N<-40)只奶牛,每只奶牛的产奶量ME(1<-Mi<-100)都不一定一样。约翰想从她们中挑出2部
分,使得每部分的产奶量之和相等,并且这个和要尽可能的大。但是这是一项复杂的操作。
输入
第一行一个数N表示奶牛的个数;后面的N行每行一个数字表示奶牛的产奶量。
输出仅一行,每部分产奶量的最大值。
输入例子:
6
1
2
39
6
10
7
输出:13
约翰有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;
}