问题描述
有n只猴子的力量值数据,我们需要求出将n只猴子分为两组后,这两组猴子总力量值之差的最小值,请求出这个最小值.
输入:第一行一个整数n,表示猴子数量,第二行n个整数,表示每只猴子的力量值.
输出:一行,表示分成两组后,两组猴子总力量值之差的最小值.
解题思路
先定义一些变量:a数组用于存储n名猴子的力量值,dp用于存储某一时刻最大力量值,min_m用于存储两队猴子最小力量差,再输入力量值并求和,再将问题转换成背包问题将n只猴子分成一支力量值不超过sum/2的队伍,循环处理对应的数据 ,再使用dp[j] = max(dp[j],dp[j - a[i]] + a[i])判断是否装入第i个数据:装入后是否更大,最后使用min_m = sum - dp[sum / 2] * 2在所有情况中,找出差值最小的.
代码实现
#include<bits/stdc++.h>
using namespace std;
// a数组用于存储n名猴子的力量值
// dp用于存储某一时刻最大力量值
// min_m用于存储两队猴子最小力量差
int a[22],min_m = 2147483647;
int dp[25001];
int main(){
int n,sum = 0;
cin >> n;
//1 输入力量值并求和
for(int i = 1;i <= n;i++){
cin >> a[i];
sum = 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 在所有情况中,找出差值最小的
min_m = sum - dp[sum / 2] * 2;
cout << min_m << endl;
return 0;
}
通过以上代码可以求出该问题的解.