题目:有n只猴子,将它们分成两组,计算这两组力量值的最小差值
//1 输入力量值并求和
for(int i = 1; i <= n;i++){
cin >> a[i];
sum += a[i];
}
//2 将问题转换成背包问题:将n只猴子分成一支力量值不超过sum/2的队伍:循环处理对应的数据
for(int i = 1; i <= n;i++){//前一个数据
for(int j = sum / 2; j >= a[i];j--){
//是否装入第i个数据:装入后是否更大
dp[j]=max(dp[j],dp[j - a[i]] + a[i]);
//3在所以情况中,找出差值最小的
mmin = sum - dp[sum/2] * 2;
总代码:
#include <bits/stdc++.h>
using namespace std;
int a[22],mmin = 111111110;
int dp[25001];
int main(){
int n,sum = 0;
cin >> n;
for(int i = 1; i <= n;i++){
cin >> a[i];
sum += a[i];
}
for(int i = 1; i <= n;i++){
for(int j = sum / 2; j >= a[i];j--){
dp[j]=max(dp[j],dp[j - a[i]] + a[i]);
}
}
mmin = sum - dp[sum/2] * 2;
cout << mmin;
return 0;
}