将兔子均匀的放入笼子;保证每个笼子中的兔子重量一致
算法题;
题目介绍:
某朋友去面试,面试官出的面试题;
题目: 现在需要将总数和各自重量都已知的兔子放进 n 个笼子中,将所有兔子全部放进去后,最终每个笼子的重量需要相同 请实现一个函数,输入 包含了所有兔子重量的数组 和 笼子的数量,输出 最终每个笼子的重量是否能够相同 提示:兔子重量为正整数,且不许杀兔子 数组长度不超过15 测试用例1: 输入:[2, 2, 3, 3, 5], 3 输出:true 解释:5只兔子按以下方式放入3个笼子后,笼子重量相同:[2, 3]、[2, 3]、[5] 测试用例2: 输入:[3, 5, 5, 6, 7], 4 输出:false 解释:5只兔子无论怎样分配到4个笼子中,笼子重量都无法相同
思路一
利用队列的方式;从大到小相加数据;循环判断。PYTHON版本
def func(arr,n): if n == 1: return True if n > 14 or sum(arr) % n != 0: return False avg = sum(arr) // n if max(arr) > avg:return False arr = sorted(arr)[::-1] for i in range(n): s = 0 test_arr = [] flag = True while flag: for k,v in enumerate(arr): if (s + v) <= avg : s += arr.pop(k) test_arr.append(v) if s == avg:flag = False break if flag and s + arr[-1] > avg :return False print(test_arr) if i == n - 1 :return True return False
PHP版本
<?php function weight($a,$count){ if(count($a) > 15 || count($a) < 1 || count($a) < $count || $count < 1){//边界 return false; } if($count < 2){ return true;//一个笼子直接true } $total = array_sum($a);//求和 if( $total%$count != 0 ){//总重量除不尽笼子数量 return false; } $avg = $total/$count; //var_dump($avg);die; rsort($a);//数组取降序 从大数字加小数字 //var_dump($a);die; $tmp = 0; for( $i=0; $i<=$count-1; $i++ ){ $flag = true; $tmp = 0; $tmp_arr = []; while ($flag){ $a = array_values($a); foreach ($a as $key=>$value){ if($tmp + $value <= $avg){ $tmp += $value; unset($a[$key]);//去除加的这个数 array_push($tmp_arr,$value); if($avg == $tmp){ $flag = false; break; } } } if($flag && $tmp + $a[$key] > $avg){ //临时加最后一个 return false; } } print_r($tmp_arr); } return true; } $re = weight([1,2,6,7,7,9], 2); var_dump($re);
思路二
创建一个 list; 循环所有兔子搭配的可能;放入list;然后 求和;算出结果;出现次数最多的那个结果;且这个结果 不大于 总的兔子重量除以笼子数; 如果该求和的所有种结果中少于 笼子的数量;说明无法均匀分配到每一个笼子中。
from itertools import combinations def combine(temp_list, n): '''根据n获得列表中的所有可能组合(n个元素为一组)''' temp_list2 = [] for c in combinations(temp_list, n): temp_list2.append(c) return temp_list2 def rabbit_arr(list1,jieguo): cage_list =[] end_list = [] for i in range(len(list1)): if combine(list1, i) != [()]: end_list.extend(combine(list1, i)) for i in set(end_list): if sum(i)<=jieguo: # 不可能大于 这个数字 否则就肯定会分不均 cage_list.append(sum(i)) # print(cage_list) na = max(cage_list, key=cage_list.count) inum = cage_list.count(na) dictns = {} for i in cage_list: if cage_list.count(i) == inum: dictns[i] = inum res =[] for k in dictns.keys(): res.append(k) return res