将兔子均匀的放入笼子;保证每个笼子中的兔子重量一致

算法题;

题目介绍:

  某朋友去面试,面试官出的面试题;

题目:
现在需要将总数和各自重量都已知的兔子放进 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

 

posted @ 2021-11-17 09:23  rianley  阅读(257)  评论(0编辑  收藏  举报