-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcount.cpp
More file actions
96 lines (89 loc) · 2 KB
/
count.cpp
File metadata and controls
96 lines (89 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <vector>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
//一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。
//比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;{3,6}{2,4,3} m=2;{3,3}{2,4}{6} m=3;
//所以m的最大值为3。这道题有些难,除了brute force的算法,你能想出比较优化的时间、空间复杂度的算法吗?
bool help2(int* a, int n, int s, int c, int* temp, int cur)
{
int complete = true;
for ( int i = 0 ; i < c; i++)
{
if ( temp[i] < s){
complete = false;
break;
}
}
if ( complete == true)
return true;
for ( int i = 0 ; i < c; i++)
{
if ( a[cur] + temp[i] <= s)
{
temp[i] += a[cur];
bool ret = help2(a, n ,s, c, temp, cur+1);
if ( ret == true)
return true;
temp[i] -= a[cur];
}
}
return false;
}
bool help(int* a, int n, int s, int c)
{
int* temp = new int[c];
if ( temp == NULL )
return false;
memset(temp, 0, c);
help2(a, n, s, c, temp,0);
return true;
}
int count(int* a, int n)
{
if ( a == NULL || n == 0 )
return 0;
sort(a, a+n);
int sum =0;
for ( int i = 0 ; i < n ;i++)
{
sum += a[i];
}
int min = a[n-1];
for ( int i = min; i< sum -1;i++)
{
if ( sum%i == 0)
{
if ( help(a, n,i,sum/i))
{
return sum/i;
}
}
}
return 1;
}
int main()
{
int input[10] = { 1,5,7,8,9,6,3,11,20,17};
int re = count(input,10);
return 0;
}