题目描述
众所周知,小明和小王经常收到小粉丝们送来的礼物,每个礼物有特定的价值,他俩想要尽可能按照自己所得价值来平均分配所有礼物。
那么问题来了,在最优的情况下,他俩手中得到的礼物价值和的最小差值是多少呢?
p.s 礼物都很珍贵,所以不可以拆开算哦
输入
[1,3,5]
返回值
1
说明
他俩一个人拿1,3.另一个人拿5
/**
*
* @param presentVec int整型vector 每个礼物的价值
* @return int整型
*/
int maxPresent(vector<int>& presentVec)
{
//价值副本,下述代码块可以直接使用presentVec
//这里为了书写方便复制了一份值给v1
vector<int> v1(presentVec);
int sum=0;//礼物总价值
//求礼物总价值的和
//可以使用<numeric>里面的accumulate(x1,x2,x3)进行求和
//x1表示起始迭代器位置
//x2表示结束迭代器位置
//x3表示初始值,当x3为0时相当于这里的sum=0
for(int x:v1)
{
sum+=x;
}
//因为是对半分,所以定义一个m等于sum的一半(向下取整,保证和不超过总值)
int m=sum/2;
//初始化记录数组元素为0,记录1-m价值区间内的每个价值的最大获取
vector<int> num(m+1,0);
//遍历一遍礼物
for(int i=0;i<v1.size();i++)
{
//m所需要的礼物的价值,每个礼物所代表的的价值
for(int j=m;j>=v1[i];j--)
{
//比较去大值
num[j]=max(num[j-v1[i]]+v1[i],num[j]);
}
}
//获得两个人中不超过半数的那一份的价值
int min=num[m];
//差值等于max-min min为总价值减去最大值
return sum-min-min;
}
详细01背包问题可以看如下链接:
01背包问题