C++程序检查给定的糖果是否可以分成重量相等的两份


假设我们有一个包含n个元素的数组A。Amal和Bimal从父母那里收到了n块糖果。每块糖果的重量要么是1克,要么是2克。他们想公平地将所有糖果分给自己,以便他们糖果的总重量相同。我们必须检查我们是否可以做到这一点。(我们不能将糖果分成两半)。

问题类别

上述问题可以通过应用贪心问题解决技术来解决。贪心算法技术是一种算法类型,其中选择当前最佳解决方案,而不是遍历所有可能的解决方案。贪心算法技术也用于解决优化问题,就像其更大的兄弟动态规划一样。在动态规划中,有必要遍历所有可能的子问题以找出最佳解决方案,但它有一个缺点;即它需要更多的时间和空间。因此,在各种情况下,使用贪心技术来找出问题的最佳解决方案。虽然它并非在所有情况下都能提供最佳解决方案,但如果设计得当,它可以比动态规划问题更快地产生解决方案。贪心技术为优化问题提供局部最优解。此技术的示例包括克鲁斯卡尔和普里姆的最小生成树 (MST) 算法、霍夫曼树编码、迪杰斯特拉的单源最短路径问题等。

https://tutorialspoint.com/data_structures_algorithms/greedy_algorithms.htm

https://tutorialspoint.com/data_structures_algorithms/dynamic_programming.htm

因此,如果我们问题的输入类似于 A = [2, 1, 2, 1],则输出将为 True,因为我们可以将其分成 [1, 2]。

步骤

为了解决这个问题,我们将遵循以下步骤:

a := 0
b := 0
n := size of A
for initialize i := 0, when i < n, update (increase i by 1), do:
   k := A[i]
   (if k is same as 1, then (increase a by 1), otherwise (increase b by 1))
if (a mod 2 is 1 OR (b mod 2 is 1 and a < 2)) then return false,
otherwise true

示例

让我们看看以下实现以更好地理解:

#include <bits/stdc++.h>
using namespace std;
bool solve(vector<int> A){
   int a = 0;
   int b = 0;
   int n = A.size();
   for (int i = 0; i < n; i++){
      int k = A[i];
      (k == 1 ? a++ : b++);
   }
   return ((a % 2 || (b % 2 && a < 2)) ? false : true);
}
int main(){
   vector<int> A = { 2, 1, 2, 1 };
   cout << solve(A) << endl;
}

输入

{ 2, 1, 2, 1 }

输出

1

更新于: 2022年4月7日

239 次查看

开启你的职业生涯

完成课程获得认证

立即开始
广告