数组平均分割

Posted 王宜鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组平均分割相关的知识,希望对你有一定的参考价值。

题意:

将一个数组分成两堆,使两堆的和的差值尽可能小。

思路:

dp。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int splitToMin(int a[], int n, int b[], int c[])
 5 {
 6     int sum = accumulate(a, a + n, 0);
 7     int dp[15][1005];
 8     memset(dp, 0, sizeof dp);
 9     for (int i = 1; i <= n; i++)
10     {
11         for (int j = sum >> 1; j >= a[i - 1]; j--)
12         {
13             dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - a[i - 1]] + a[i - 1]);
14         }
15     }
16     int tot = dp[n][sum >> 1], ans[15];
17     memset(ans, 0, sizeof ans);
18     for (int i = n; i >= 1; i--)
19     {
20         if (dp[i][tot] > dp[i - 1][tot])
21         {
22             tot -= a[i - 1];
23             ans[i - 1] = 1;
24         }
25     }
26     int x = 0, y = 0;
27     for (int i = 0; i < n; i++)
28     {
29         if (ans[i]) b[x++] = a[i];
30         else c[y++] = a[i];
31     }
32     return abs(sum - 2 * dp[n][sum >> 1]);
33 }
34 
35 int main()
36 {
37     int a[] = {61, 82, 100, 61, 61};
38     int b[10], c[10];
39     memset(b, 0, sizeof b); memset(c, 0, sizeof c);
40     cout << splitToMin(a, 5, b, c) << endl;
41     for (int i = 0; i < 5; i++) cout << b[i] << " ";
42     cout << endl;
43     for (int i = 0; i < 5; i++) cout << c[i] << " ";
44     cout << endl;
45     return 0;
46 }

 

以上是关于数组平均分割的主要内容,如果未能解决你的问题,请参考以下文章

时间序列分割

如何在按钮之间平均分割字符串的字符?

C++将整数数组分割成奇数和偶数两个数组的源码

[LeetCode] Split Array With Same Average 分割数组成相同平均值的小数组

创建特征向量以对空中图像中的片段进行分类

php如何平均分割字符串 例分割为四部分