现在需要将总数和各自重量都已知的兔子放进 n 个笼子中,将所有兔
2022-08-01 本文已影响0人
一位先生_
题目:
现在需要将总数和各自重量都已知的兔子放进 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