(摆书)二分答案转化为判定

一个最优解问题中,最优解是唯一的,所以我们可以利用二分的方法来找到这个解,但是我们要如何才能知道这个解呢。将这个最优解问题转化为一个解函数问题“定义域x” 就是这个问题的可行方案,“值域y” 就是这个问题在所有可行方案的执行下得到的 评估值。例如评估值是越高越优,假设最优解是P,则在P的右边(大于P)的评估值中,都不存在一个合理方案x能达到这些评估值,而在P的左边(小于P)的评估值中一定存在一个合理方案x能达到或者超过这些值。所以可以将其画成一个数轴,数轴上代表的值是在得知最优解为P的情况下,当前点是否能有存在一个可行方案使得解比当前点的可行方案的解更优,所以数轴上有一个P点,在P点的左边值为1,P点的右边的值为0,所以可以通过二分的方法找出最优解和可行方案。

例题:有n本书排成一排,第i本书的厚度是di,将他们分成连续的m组,使T最小化,T表示厚度之和最大的一组的厚度(意思就是有很多种分法,但是将每一种分法中的最大厚度的那一组拿出来排序,找到最小的一组)。

来分析一波,设值域评估值是一组中厚度之和最大的,定义域可行方案是将之分为m组,假设Y是最优解。所以在Y的左边不存在有个可行方案使得能够达到这些评估值,在Y的右边一定存在一个可行方案能达到或者小于这些评估值。利用二分的方法,将所分的组数小于等于Y,若分的组数大于m,则将左边部分去掉,如果组数小于等于m,则砍掉右边的部分。最后的到一个数在可行与不可行的中间。

大致代码

#include<iostream>
using namespace std;
const int N = 10000;
int a[N];
int res(int n){
	for(int i=1;i<=n;i++){
		//将厚度之和小于等于m的放一组 
	}
	//return 是否大于m组 
	return 0; 
}

int main()
{
	int l=0,r=N; 
	while(l<r){
		//if 大于m组,则r=mid
		//if 小于等于m组,则l=mid 
	}
	
	return 0;
 } 
发布了6 篇原创文章 · 获赞 6 · 访问量 160

猜你喜欢

转载自blog.csdn.net/weixin_43626741/article/details/104364387