泡泡的课堂小练习之分礼物

题目描述

众所周知,小明和小王经常收到小粉丝们送来的礼物,每个礼物有特定的价值,他俩想要尽可能按照自己所得价值来平均分配所有礼物。

那么问题来了,在最优的情况下,他俩手中得到的礼物价值和的最小差值是多少呢?
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背包问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值