给出N个数字,将其分成M份,每一份的和是相等的,求和最大的分割,每
一份并不要求是原序列中连续的元素。
比如3 2 4 3 6,最大和的分割是3 2 4和3 6
假定每一份的和是已知的,为S,判断N个元素的序列是否能被分成M份,
每一份元素的和为S。判断的方法如下,首先从N个元素中任取一个,如
果当前份和不为S,接着再取一个,直到和为S。然后在剩下的元素中继
续这一过程,直到选取完所有的元素,这一过程正是一个全排列的过程。
计算N个数字之和Sum,最大的数Max,S/Max=K, 则S的取值为
Sum/K,Sum/K-1, Sum/K-2,,,2的分割,则该算法的复杂度为K*N!
这个算法有些地方可以考虑优化,一、每一份的元素的顺序不需要考虑,但
是上面给出的全排列就考虑了顺序,二、全排列并不需要计算完就可以
提前终结,比如S为4,先选取了一个元素3,但是序列中没有为1的元素,则
没有必要接着列举其他的排列。代码并没有考虑这两个问题。
#include
#include
#include
#include
#include
bool check( std::vector &vi, int sum ) {
int temp = 0;
for( int i = 0; i < vi.size(); i++ ) {
temp += vi[i];
if( temp > sum ) return false;
if( temp == sum ) temp = 0;
}
return true;
}
bool permPart( std::vector &vi, int sum, int begin) {
if( begin >= vi.size() )
return (check(vi, sum) ? true : false);
for( int i = begin; i < vi.size(); i++ ) {
std::swap( vi[begin], vi[i] );
if( permPart(vi, sum, 1+begin) ) return true;
std::swap( vi[begin], vi[i] );
}
return false;
}
bool findMaxSubarrySum( std::vector &vi, int &max ) {
std::sort( vi.begin(), vi.end(), std::less() );
int big = vi[vi.size() - 1];
int sum = std::accumulate( vi.begin(), vi.end(), 0 );
bool find = false;
for( int k = sum / big; k >= 2; k-- ) {
int cur = sum / k;
if( k * cur == sum && permPart(vi, cur, 0) ) {
max = cur;
find = true;
}
}
return find;
}
int main ( int argc, char *argv[] ) {
int a[] = { 3, 2, 4, 3, 6 };
std::vector vi(a, a + 5);
int max_sum;
if( findMaxSubarrySum(vi, max_sum) ) {
std::cout << "max_sum:" << max_sum << std::endl;
}
int a1[] = {1, 2, 4, 3, 3, 1};
std::vector vi1(a1, a1 + sizeof(a1)/ sizeof(int) );
int max_sum1;
if( findMaxSubarrySum(vi1, max_sum1) ) {
std::cout << "max_sum1:" << max_sum1 << std::endl;
}
getchar();
return 0;
} /* ---------- end of function main ---------- */
给定一个序列S,S[i]
#include
#include
#include
#include
#include
using namespace std;
int bruteForce( int b[], int len ) {
int max = 0;
for( int i = 0; i < len; i++ ) {
int j;
for( j = len - 1; i < j && b[i] >= b[j];
j-- ) ;
if( j - i > max ){
max = j - i;
}
}
return max;
}
struct DInd {
int val_;
int index_;
DInd( int val, int index ) : val_(val), index_(index) { }
DInd( ) : val_(0), index_(-1) { }
bool operator<( const DInd & di ) const {
return val_ < di.val_;
}
};
int sortingMethod( int b[], int len ) {
std::vector di( len, DInd() );
for( int i = 0; i < len; i++ ){
di[i].val_ = b[i];
di[i].index_ = i;
}
std::sort( di.begin(), di.end(), std::less() );
std::vector m( len, false );
int mi = len - 1;
int max = 0;
for( int i = 0; i < len; i++ ) {
m[di[i].index_] = true;
while( mi >= 0 && m[mi] == true )
mi--;
if( mi - di[i].index_ > max )
max = mi - di[i].index_;
}
return max;
}
int main()
{
int b[] = { 4, 3, 5, 2, 1, 0,6, -1 };
cout<
#include "stdafx.h"
#include
#include
#include
#include
#include "my_algorithm.h"
using namespace std;
typedef pair Pair;
void maxSlidingWindow( int A[], int n, int w, int B[] ) {
priority_queue queue;
for( int i = 0; i < w; i++ ) {
queue.push( Pair(A[i], i) );
}
B[0] = queue.top().first;
for( int i = w; i < n; i++ ) {
queue.push( Pair(A[i], i) );
Pair p = queue.top();
while( i - w + 1 > p.second ) {
queue.pop();
p = queue.top();
}
B[i - w + 1] = p.first;
}
}
void maxSlidingWindow2( int A[], int len, int w, int B[] ) {
deque Q;
for( int i = 0; i < w; i++ ){
while ( !Q.empty() && A[i] >= A[Q.back()] )
Q.pop_back();
Q.push_back(i);
}
B[0] = A[Q.front()];
for( int i = w; i < len; i++ ) {
while ( !Q.empty() && A[i] > A[Q.back()] )
Q.pop_back();
Q.push_back(i);
while( !Q.empty() && Q.front() < i - w + 1 )
Q.pop_front();
B[i - w + 1] = A[Q.front()];
}
}
void printArray( int B[], int len ) {
for( int i = 0; i < len; i++ ) {
cout<
#include "stdafx.h"
#include
#include "my_algorithm.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = { 1, 3, -1, -3, 5, 3, 6, 7 };
const int La = sizeof(a) / sizeof(int) ;
int b[ La - 2 ] = {0};
maxSlidingWindow( a, La, 3, b );
printArray( b, La - 2 );
maxSlidingWindow( a, La, 3, b );
printArray( b, La - 2 );
return 0;
}