【网易算法提前批】平分物品

简介: 现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。

一、题目描述

现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。


要求:时间复杂度O ( 3 n ) O(3^n)O(3

n

),空间复杂度O ( n ) O(n)O(n)


输入描述

第一行输入一个整数 T,代表有 T 组测试数据。
对于每一组测试数据,一行输入一个整数 n ,代表物品的个数。
接下来 n 个数,a[i] 代表每一个物品的价值。
1<= T <= 10
1 <= n <= 15
1 <= a[i] <= 100000

输出描述:

对于每一组测试数据,输出一个答案代表最少需要扔的价值。

测试用例:

输入:
1
5
30 60 5 15 30
输出:20
栗子说明:样例解释,扔掉第三个和第四个物品,然后将第一个物品和第五个物品给第一个人,第二个物品给第二个人,每一个人分到的价值为60,扔掉的价值为20。

二、解题思路

dfs遍历,每个节点的子结点中,有三种情况:给第一个人,给第二个人,丢掉。


几个变量说明:

n:需要选择的物品的总共数量。

sum:所有元素的总和。

全局变量res:找出满足情况的最值res,min(res, sum - result1 - result2)。


dfs的递归边界是遍历到最后一个元素,并且结束条件:搜索到最后一个物品时,判断res1和res2两者是否相等,如果相等则记录并更新res值。


三、C++代码

#include <iostream>
#include<vector>
#include<algorithm>
#include<limits.h>
using namespace std;
// 最小扔掉的价值
int res = INT_MAX;
void dfs(vector<int>& nums, int res1, int res2, int sum, int index, int n){
  //一直选到最后一个数字才返回
  if(index == n){
    if(res1 == res2){
      res = min(res, sum - res1 - res2);
      //res = sum - res1 - res2;
    }
    return;
  }
  // 每次的选择环节都有3种选择
  dfs(nums, res1 + nums[index], res2, sum, index + 1, n);
  dfs(nums, res1, res2+ nums[index], sum, index + 1, n);
  dfs(nums, res1, res2, sum, index + 1, n);
}
int main (){
  int t;
  cin >> t; // 组数
  while(t--){
    int n;//该组的物品总数
    cin >> n;
    int temp; //当前存入值
    vector<int> nums;
    for(int i =0; i < n ; i++){
      cin >> temp;
      nums.push_back(temp);
    }
    // 计算该组的元素总和
    int sum = 0;
    for(auto i : nums){
      sum += i;
    }
    //vector,res1和res2和index初始都是0,sum需单独设变量存起来
    dfs(nums, 0, 0, sum, 0, n);
    cout<<res<< endl;
    res = INT_MAX;
  }
  system("pause");
  return 0;
}
相关文章
|
算法 搜索推荐 Python
推荐算法的Python实现——ItemCF(基于物品的协同过滤)
推荐算法的Python实现——ItemCF(基于物品的协同过滤)
|
Rust 算法 安全
【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)
给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型、颜色以及名称。 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。 如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 : ruleKey == "type" 且 ruleValue == typei 。 ruleKey == "color" 且 ruleValue == colori 。 ruleKey == "name" 且 ruleValue == namei 。 统计并返回 匹配检索规则的物品数量
【算法学习】1773. 统计匹配检索规则的物品数量(java / c / c++ / python / go / rust)
|
机器学习/深度学习 搜索推荐 算法
机器学习推荐算法之协同过滤(基于物品)【案例+代码】
机器学习推荐算法之协同过滤(基于物品)【案例+代码】
532 0
机器学习推荐算法之协同过滤(基于物品)【案例+代码】
|
搜索推荐 算法 大数据
基于用户(UserCF)和基于物品(ItemCF)协同过滤算法原理
大数据的典型应用之一就是推荐系统,淘宝、亚马逊、facebook等等大企业都在使用推荐系统,且推荐系统是它们盈利的相当大的来源。而基于用户的协同过滤算法和基于物品的协同过滤算法是推荐系统中最基本的算法,本文将用非常浅显易懂的语言对这两种算法进行原理剖析。
|
算法 搜索推荐
基于物品的协同过滤算法(ItemCF)
ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通过分析用户的行为记录来计算用户的相似度。该算法认为物品A和物品B相似的依据是因为喜欢物品A的用户也喜欢物品B。
19948 0
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
8天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。