ACM程序设计基础第八周(分组背包、二分法)的学习总结与感悟


前言

本周通过在课上的学习,学习了分组背包的特点以及实例化应用,学习完了所有背包问题的类型,同时又学习了二分法这一解决问题的方法,虽然学习过程中理解并不是特别的难(相较于之前的线性、动态dp、背包),但是在一些题目中所需要注意的细节有很多,如下对分组背包类型,以及实例化作简单的分析,着重对二分法的概念以及特点、分类作出重点总结和感悟

一、分组背包

1.问题特点:有N件物品(每个物品都有一个,且有对应的占容w[i]和价值c[i])和一个限容为V的背包,将这些物品划分为若干组,组内每件物品都不一样,且选择的时候只能选择一组中的一件物品或者不选,求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
2.解题思想:

对于组外的策略,可以选也可以不选,当选择的时候选哪个,决定了组内,组内有若干个策略,设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有f[ k ][ v ]=max{ f[ k-1 ][ v ],f[ k-1 ][ v-w[ i ] ] + c[i] | 物品i属于第k组 }。

3.伪码:

for 所有的组k

    for v=V..0

        for 所有的i属于组k

      f[v]=max{f[v],f[v-w[i]]+c[i]}

注意:“for v=V…0”这一层循环必须在“for 所有的i属于组k”之外。这样才能保证每一组内的物品最多只有一个会被添加到背包中。

二、二分法

1.二分分类:二分查找、二分答案
2.二分法使用的模板:
实数
(1)往左查找

while (l < r)
    {
        int mid = l + r >> 1;	//(l+r)/2(而位运算比普通的除法运算要快的多)
        if (check(mid)) 
         r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }

注意:当向左查找时,mid不用加一,r=mid,l减一

(2)往右查找

while (l < r)
    {
        int mid = l + r + 1 >> 1;	//(l+r+1)/2
        if (check(mid)) 
         l = mid;
        else r = mid - 1;
    }

注意:当向友查找时, mid要加一,l=mid,r要减一

浮点数

while(r-l>1e-5) //需要保证精度
	{
		double mid = (l+r)/2;
		if(check(mid))
		 l=mid; //或r=mid;
		else r=mid; //或l=mid;
	}

注意:浮点除法不会取整,所以mid,l,r,都不用加1或减1

3.二分查找
(1)概念:每次查找去掉不符合条件的一半区间,直到找到答案(整数二分)或者和答案十分接近(浮点二分)
(2)注意

==区间是有单调性的,==查找第一次出现的位置,如果查到一个值比目标值大,就把右半边放弃,因为右半边肯定也比目标值大;同样,如果查到值比目标值小,那就放弃左半边。

4.二分答案
(1)概念:答案属于一个区间,当这个区间很大时,用暴力的做法就会超时。但若所分析的区间某个量具有单调性,每一次二分就会判断一次,看是否所求量达到了需要

判断:利用check函数,如果满足check,就放弃右半区间(或左半区间),如果不满足,就放弃左半区间(或右半区间)。一直往复,直至到最终的答案

(2)使用条件:

1、答案在一个区间内(一般情况下,区间会很大,暴力超时)
2、直接搜索不好搜,或者直接搜索复杂度太高,但是容易判断一个答案可行不可行
3、该区间对题目具有单调性,即:在区间中的值越大或越小,题目中的某个量对应增加或减少。

(3)对应例题:
木材(切割网线)加工

分析:1,答案在一个区间里。
2,如果给一个答案,给目标一个小段的长度,很容易判断是否到K个了。
3,具有单调性,目标小段越长,那能切出的段数越少,目标小段越短,能切出的段数越多。而最终需要K个,从而很容易判断一个答案行不行。
求解最大值,往右寻找,利用模板二求解

How can you find it(数字和查找(类似于水仙花数))

分析:若和求解水仙花数那样,利用循环的方式求解,复杂度太高,不符合题意,必然会出现超时,但若利用二分法,先合并两组成为一组作为寻找待定组,将等式数学变换,再利用二分法遍历剩下的一个数组(枚举容量较小的那一个数组,复杂度较低),再在合并组中进行二分查找

心得感悟

在学习二分法时,虽然概念不难理解,就是折合区间查找所需要的答案,但求解题目的分类多样,以及求解题目时所需要注意的细节较多
1.首先若碰到浮点答案求解时,处理面积数据时,要先扩大百万倍,处理完之后再缩小到原来的百万分之一,保证精确度
2.Π的写法:不能直接写Π所对应的小数,即使写到百位千位之后也存在一定的误差,精确度最高的写法是利用反三角函数定义Π的大小
3.除2的快捷方式:向右移位操作
4.输入大量数据时,要自定义输入函数,按字符输入整数

题目的多样性对应方法

当题目出现求…最大值的最小 、 求…最小值的最大会比较绕,具体解法如下
1、求…最大值的最小,即求二分答案(即二分最大值)的时候,判断条件满足后,尽量让答案往前来(即:让r=mid),对应模板1
2、同样,求…最小值的最大时,即求二分答案(即二分最小值)的时候,判断条件满足后,尽量让答案往后走(即:让l=mid),对应模板2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值