算法:php求几个数字之和刚好大于或等于某一个给定的值
2017-09-22 09:06
253 查看
经常有这样的例子,求解几个数之和最接近于给定的值,今天我们就来讨论一下另外一种情况,求几个数字之和刚好大于或等于某一个给定的值。
实际应用场景,例如一个用户在网上购物,需要购买某种商品20件,但是网上的几家店中,没有那家店单独有这么多商品,此时就需要几家店面一起凑够20件商品,考虑到发货成本,肯定参与发货店家越少越好,下面给出该算法的设计思路。
程序设计的关键之处在于理解所有的取值结果一定在所有门店的子集当中,然后给子集按照需求排序,便可便利得出想要的结果。
实际应用场景,例如一个用户在网上购物,需要购买某种商品20件,但是网上的几家店中,没有那家店单独有这么多商品,此时就需要几家店面一起凑够20件商品,考虑到发货成本,肯定参与发货店家越少越好,下面给出该算法的设计思路。
<?php //事例:A门店某商品10件,B门店某商品20件,C门店某商品5件,D门店某商品8件,E门店某商品9件 /*设计思路: 1.一个商店能满足的情况下,不采用多个门店发货。如用户购买5件,则去C门店取,保证 门店数-购买数 最小。同理2个商店能够满足,不采用三个商店。 2.多个商店能够满足的情况下,取门店数和相加最少的项,比如(20,5),(20,9)都能满足24件购买量,取前者的配置方式, 因为20+5<20 9="" planstorearr="['A'=">'10','B'=>'20','C'=>'5','D'=>'8','E'=>'9']; */ $buyNum=20; //20为用户想购买这个商品的件数,planStoreArr表示目前可供选择门店的集合 然后通过计算$planArr的子集排序取值 $planArr=getBuyStorePlan($buyNum,$planStoreArr); //var_dump($planArr); //商品计划购买方法 function getBuyStorePlan($buyNum,$planStoreArr){ asort($planStoreArr); global $result; $result=array();//进入方法前先定义全局变量存放数组所有子集 //为了便于比较,取出数组中的值单独作为数组 foreach($planStoreArr as $key=>$v){ $planVArr[]=$v; } build($planVArr,array(),0); //求出方案的所有子方案 $len=count($result); //1.冒泡排序通过数组元素个数依次从大到小排列 for($i=0;$i<$len;$i++){ for($j=$i;$j<$len;$j++){ if(count($result[$j])<count($result[$i])){ $change=$result[$j]; $result[$j]=$result[$i]; $result[$i]=$change; } } } //2.在1的基础上按照和的大小从大到小排列, for($i=0;$i<$len;$i++){ for($j=$i;$j<$len;$j++){ if((count($result[$j])==count($result[$i]))&&array_sum($result[$j])<array_sum($result[$i])){ $change=$result[$j]; $result[$j]=$result[$i]; $result[$i]=$change; } } } //上述的结果类似[[],["5"],["8"],["9"],["10"],["20"],["5","8"],["5","9"],["10","5"],["8","9"]... //3.依次匹配到最近的一个值 $answer=array(); for($i=0;$i<$len;$i++){ if(array_sum($result[$i])>=$buyNum){ $answer=$result[$i]; break; } } //4.匹配门店组装结果,取出对应的门店 for($i=0;$i<$len;$i++){ if($v==$answer[$i]){ $planArr[$k]=$v; unset($planStoreArr[$k]); break; } } } arsort($planArr); $total=0; //5.计算每个门店的发货量 foreach($planArr as $k =>$v){ $total+=$v; if($total>$buyNum){ //echo $total; $planArr[$k]=$v-($total-$buyNum); break; } } return $planArr; } ?>
程序设计的关键之处在于理解所有的取值结果一定在所有门店的子集当中,然后给子集按照需求排序,便可便利得出想要的结果。
相关文章推荐
- 描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
- (笔试中的题目)一个已经排序好的数组找到两个数字相加等于一个给定的数
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
- 快速找出一个数组中的两个数字,其和等于给定值。
- 给定一个字符串和一个整数k,对字符串开头算起的每2k个字符的前k个字符进行反转。 如果还有少于k个字符,则将其全部撤消。 如果小于2k但大于或等于k个字符,则反转前k个字符,
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法
- 程序员面试题:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值
- 任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114
- 题目:请给出一个运行时间为Θ(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
- Map中提供的一个算法(提供一个值,返回大于等于该值的最接近的2的指数幂)
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
- 假设你有一个随机的队列列表。 每个人用一对整数(h,k)来描述,其中h是人的身高,k是身高大于或等于h的人前面的人数。 编写一个算法来重建队列。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个字符串,返回字符串中相邻的字符个数大于等于2的记录数
- 求解一个数组里等于给定整数和的两个数的O(n)时间复杂度算法
- LeetCode试题之““给定一个正整数A,找到最小的正整数B,它的每一个数字的乘法等于A。””
- 算法: 给定一个字符串,在字符串中找到最长的数字串
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法
- 链表分割 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以