给定总车轮数计算2轮、4轮车辆不同组合数的算法求解
问题核心分析
题目要求统计两类车轮数不同的组合数,和车辆排列顺序无关,本质是求满足 2*a +4*b = n(a、b均为非负整数,分别代表2轮车、4轮车数量)的整数解个数。
原代码错误点
- 计数逻辑错误:原代码采用类似爬楼梯的递归思路,将「选2轮车再选4轮车」和「选4轮车再选2轮车」判定为不同方案,统计的是排列数而非组合数,和题目要求不符。
- 存在拼写错误:递归调用时写的函数名是
uniqueCounts(多了末尾的s),和定义的uniqueCount不匹配,运行会直接报错。
正确解法
思路推导
- 2和4都是偶数,若总车轮数n为奇数,必然没有合法方案,直接返回0;若n<2,也不存在合法车辆,返回0。
- 固定4轮车的数量b即可唯一确定组合:b的取值范围是从0到
n//4(4轮车最多可装的数量),每个合法b对应的2轮车数量a=(n-4*b)//2必然是非负整数(偶数减偶数仍为偶数,可被2整除)。 - 总方案数就是b的可选值总数,即
(n//4) +1,可以直接通过数学公式O(1)计算,不需要递归或动态规划。
代码实现
def uniqueCount(wheels): # 奇数车轮、车轮数小于2都没有合法方案 if wheels % 2 != 0 or wheels < 2: return 0 max_4wheel = wheels // 4 return max_4wheel + 1
结果验证
- 输入4:
4//4 +1 =2,对应2种方案,符合示例 - 输入6:
6//4 +1=2,对应2种方案,符合示例 - 输入10:
10//4 +1=3,对应3种方案,符合示例
如果需要用动态规划思路实现(适配更多车辆类型的扩展场景),可以用完全背包求组合数的写法,固定遍历物品的顺序避免统计排列:
def uniqueCount(wheels): if wheels % 2 != 0 or wheels < 2: return 0 # dp[i] 表示i个车轮对应的合法组合数 dp = [0] * (wheels + 1) dp[0] = 1 # 0个车轮的空组合作为初始值 # 先遍历2轮车,统计仅用2轮车的组合数 for i in range(2, wheels + 1): dp[i] += dp[i - 2] # 再遍历4轮车,累加加入4轮车后的组合数,固定顺序不会重复统计排列 for i in range(4, wheels + 1): dp[i] += dp[i - 4] return dp[wheels]
内容的提问来源于stack exchange,提问作者Moustafa Makhlouf
相关产品推荐
相关产品推荐

