首页 > 试题广场 >

牛能和牛可乐的礼物

[编程题]牛能和牛可乐的礼物
  • 热度指数:3796 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
众所周知,牛能和牛可乐经常收到小粉丝们送来的礼物,每个礼物有特定的价值,他俩想要尽可能按照自己所得价值来平均分配所有礼物。

那么问题来了,在最优的情况下,他俩手中得到的礼物价值和的最小差值是多少呢?
p.s 礼物都很珍贵,所以不可以拆开算哦

示例1

输入

[1,2,3,4]

输出

0

说明

他俩一个人拿1,4 。另一个人拿2,3
示例2

输入

[1,3,5]

输出

1

说明

他俩一个人拿1,3.另一个人拿5

备注:
单个礼物价值不超过100,礼物个数小于100,所有礼物总价值不超过10000
  • 将问题转化为0-1背包问题来解决
  • 思路:我们取礼物价值总和数的一半(向上取)来作为我们背包的容量,我们要尽可能地去填满这个背包,这样差值就是最小
import java.util.*;
public class Solution {
    /**
     * 
     * @param presentVec int整型一维数组 每个礼物的价值
     * @return int整型
     */
    public int maxPresent (int[] presentVec) {
        // write code here
        int n = presentVec.length;
        if(n == 0) return 0;
        int sum = 0;
        for(int i = 0; i < n; i++){
            sum += presentVec[i];
        }
        //简化为背包问题
        int v = (sum + 1) / 2;
        int[] dp = new int[v+1];
        for(int i = 0; i < n; i++){
            int p = presentVec[i];
            for(int j = v; j >= p; j--){
                dp[j] = Math.max(dp[j], dp[j-p]+p);
            }
        }
        int result = 2*dp[v] - sum;
        return  result >= 0 ? result : -result;
    }
}
发表于 2020-03-27 00:44:13 回复(0)