【问题标题】:Divide array into two equal parts with minimal difference and Find sum of each part将数组分成两个相等的部分,差异最小并找到每个部分的总和
【发布时间】:2021-07-05 06:59:59
【问题描述】:

您好,我正在尝试使用蛮力解决问题,但我不知道如何解决它。我试了几个小时。

考虑一个数组 inputArray,其中至少有两个非零正整数,范围在 1 到 300 之间。根据这些规则将阵列器分成两组。

  1. 每个整数都应属于两个组之一
  2. 每个组中的整数总和必须尽可能接近。
  3. 两组之间的整数总数之差不应超过 1

我需要返回每组的总和

【问题讨论】:

  • 这个问题是 np-complete。你会在这里找到一些信息:en.wikipedia.org/wiki/Partition_problem
  • @Basto 虽然问题确实是 np-complete,但问题是明确要求暴力解决方案,这表明它们将被限制在相对较小的输入范围内。
  • @alti21:你说“我尝试了几个小时”。你尝试了什么?你遇到了哪些困难? “用蛮力”给你什么启发?
  • @Stef 是的,但在 wiki 文章中,在“精确算法”部分,描述了一些蛮力算法。顺便说一句,第三条规则将减少这些算法的时间
  • @Stef 我看不出这个问题有什么模式

标签: arrays algorithm data-structures sum integer


【解决方案1】:

我用 c++ 解决了这个问题

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int ans(int i,int n,float s)
{
  if(i<n-1) return INT_MAX;
  if(n==0) return abs(s);
  return min(ans(i-1,n-1,s-v[i-1]),ans(i-1,n,s));
}
 
int main()
{
  string s;
  cin>>s;
  int c=0;
  for(int i=0;i<s.length();i++)
  {
    if(s[i]==',') {v.push_back(stoi(s.substr(c,i-c)));
    c=i+1;}
  }
  v.push_back(stoi(s.substr(c,s.length()-c)));
   //for(int i=0;i<v.size();i++) cout<<v[i];
  int ss=0;
  for(int i=0;i<v.size();i++) ss+=v[i];
  int n1=v.size();
  int n2=n1/2;
  float su=ss/2;
  int k=ans(n1-1,n2,su);
  cout<<ss-su-k<<" "<<su+k;
 
}

这是解决方案 希望对你有帮助

output image

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多