编程实现: 小明收藏了N(2≤N≤25)个数字币,每个数字币上都有一个面值(面值可以重复)。从数字币中任选K(2≤K≤N)个,有多种选法,请将每次选择的数字币上的面值累加,然后解决以下两个问题。 问题1:累加的和中有多少种不同的结果; 问题2:累加的和中有多少个不同的合数。 例如:N=5,K=3,5个数字币上的面值分别为2、1、4、5、3,任选3个数字币,有10种选法,将每种选法上的面值累加: 2+1+4=7、2+1+5=8、2+1+3=6、2+4+5=11、2+4+3=9、2+5+3=10、1+4+5=10、1+4+3=8、1+5+3=9、4+5+3=12。 其中累加的和中有7种不同的结果,分别是7、8、6、11、9、10、12, 累加的和中有5个不同的合数,分别是8、6、9、10、12。
时间: 2024-02-01 22:13:32 浏览: 226
确定将一定数量的钱比如100,换成1,2,5,10,20,50元的组合问题(4)
问题1的解决方案:
我们可以使用递归的方式来实现。首先,我们需要定义一个函数来计算选择k个数字币时,累加的面值和中有多少种不同的结果。我们可以将这个问题转化为一个组合问题,每次从剩余的数字币中选择一个数字币,将其面值加入当前的面值和中,并递归地计算剩余数字币中选择剩下k-1个数字币的结果。当k=1时,说明已经选择了k个数字币,返回1。最终,将所有结果加起来即可。
问题1的代码实现:
```python
def count_diff_sums(coins, k, cur_sum, cur_idx):
if k == 1:
return 1
res = 0
for i in range(cur_idx, len(coins)):
res += count_diff_sums(coins, k - 1, cur_sum + coins[i], i + 1)
return res
n = 5
k = 3
coins = [2, 1, 4, 5, 3]
print(count_diff_sums(coins, k, 0, 0))
```
问题2的解决方案:
我们可以首先定义一个函数来判断一个数是否为合数。然后,在上面的基础上进行修改,当累加的面值和为合数时,累加结果加1。最终,返回累加结果即可。
问题2的代码实现:
```python
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def count_diff_composites(coins, k, cur_sum, cur_idx):
if k == 1:
return int(is_prime(cur_sum))
res = 0
for i in range(cur_idx, len(coins)):
res += count_diff_composites(coins, k - 1, cur_sum + coins[i], i + 1)
if is_prime(cur_sum):
return res
else:
return res + 1
n = 5
k = 3
coins = [2, 1, 4, 5, 3]
print(count_diff_composites(coins, k, 0, 0))
```
阅读全文