小明收藏了N(2N<25)个数字币,每个数字币上都有一个面值 (面值可以重复)。从数字币中任选K (2sKsN)个,有多种选法,请将每次选择的数字币上的面值累加,然后解决以下两个问题。问题1:累加的和中有多少种不同的结果问题2:累加的和中有多少个不同的合数
时间: 2023-06-20 19:04:54 浏览: 463
问题1:
将所有数字币的面值存储到一个数组中,然后使用DFS遍历所有可能的组合(即长度为k的所有子集),并将每个组合的累加和存储到一个集合中。最后返回集合的大小即可。
代码实现如下:
```python
def dfs(nums, k, start, cur_sum, res_set):
if k == 0:
res_set.add(cur_sum)
return
for i in range(start, len(nums)):
dfs(nums, k-1, i, cur_sum+nums[i], res_set)
def count_different_sums(nums, k):
res_set = set()
dfs(nums, k, 0, 0, res_set)
return len(res_set)
```
问题2:
首先需要一个函数来判断一个数是否为合数。一个数是合数当且仅当它不是质数且大于1。判断一个数是否为质数可以使用试除法,即从2到sqrt(n)枚举所有数,判断n是否能被整除。如果能被整除,则n不是质数。
然后就可以在DFS遍历的过程中,对于每个累加和判断是否为合数,并统计合数的数量。代码实现如下:
```python
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
def dfs(nums, k, start, cur_sum, res_set, composite_count):
if k == 0:
res_set.add(cur_sum)
if not is_prime(cur_sum) and cur_sum > 1:
composite_count[0] += 1
return
for i in range(start, len(nums)):
dfs(nums, k-1, i, cur_sum+nums[i], res_set, composite_count)
def count_composite_sums(nums, k):
res_set = set()
composite_count = [0]
dfs(nums, k, 0, 0, res_set, composite_count)
return composite_count[0]
```
注意,为了方便统计合数的数量,这里使用了一个长度为1的列表`composite_count`,将其作为参数传递给DFS函数,DFS函数中修改`composite_count[0]`的值,最后返回的就是合数的数量。
完整代码如下:
阅读全文
相关推荐

















