最大值最小化问题(分治解法)
2010-07-16 14:50
309 查看
把一个包含n个正整数的序列划分成m个连续的子序列(每个正整数恰好属于一个序列)。设i个序列的各数之和为S(i),你的任务是让所有S(i)的最大值尽量小。
#include <iostream> #include <ctime> using namespace std; #define N 10 #define INF 1000 int juge(int a[],int mid,int k) { int i; int seg=0; int sum=0; for(i=0;i<N;i++) { sum+=a[i]; if(sum>mid) //从左到右将数组元素之和与mid比较,如是大于则再起一段,最后看段的大小 { sum=a[i]; seg++; } } if(seg>=k) //若是段超过3,则必然不和条件 return 0; else return 1; } int value(int a[],int low,int high,int segment) //分治法求解 { if(low>high) return high+1; else { int mid=(low+high)/2; if(juge(a,mid,segment)==1) //如果试验数mid符合要求,递归到前一半 return value(a,low,mid-1,segment); else //如果试验数mid不符合要求,递归到后一半 return value(a,mid+1,high,segment); } } int main() { srand((unsigned)time(NULL)); int a ; for(int ifor=0;ifor<N;ifor++) a[ifor]=rand()%20; for(ifor=0;ifor<N;ifor++) cout<<a[ifor]<<" "; //int a ={9,19,15,13,13,9,14,1,1,7}; int m=3; cout<<endl; //求出队列中所有数的和max,还要求出当中最小的数min int min=INF,max=0; for(int i=0;i<N && a[i]!=' ';i++) { max+=a[i]; if(a[i]<min) min=a[i]; } cout<<endl; int tem=value(a,min,max,m); //调用value函数求值 cout<<tem<<endl; return 0; }
相关文章推荐
- 最大值最小化问题——分治
- 二分法解决最大值最小化问题
- 编程之美-2.7最大公约数问题java解法
- 分治策略算法之最大字数组和问题
- 【算法设计-分治】最大子数组问题
- 分治策略 | 最大子数组问题
- 分治问题,求最大子序列HDU1231
- 编程之美读书笔记3.7队列中取最大值操作的问题 解法2
- 分治法对最大连续和以及归并排序,分治与递归实质把问题区间区域分割成几个小区间或者小分区,一直下钻到一个元素小区解决问题
- JZOJ4828. 【GDOI2017模拟10.30】最大值 分类讨论+分治处理子集问题
- 如何理解最大化最小值问题和最小化最大值问题
- UVa11413 - Fill the Containers(最大值最小化问题)
- 分治——最大子数组问题
- 最大公约数问题的优化解法
- 数组的众数问题的分治解法
- 算法导论-分治、最大子序列问题
- C++MFC程序窗口无法显示最大最小化按钮问题
- 算法导论:分治策略__最大子数组问题
- 数字问题之最大公约数问题全解法归纳<Java实现>
- 分治与递归:寻找最大元问题