洛谷P1036选数|递归
题目描述
已知 n 个整数 x1,x 2 ,…,xn,以及1个整数k(k<nk<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29
输入格式
键盘输入,格式为:
n,k(1≤n≤20,k<n)
x1,x2,…,xn(1≤xi≤5000000)
输出格式
屏幕输出,格式为:1个整数(满足条件的种数)。
输入输出样例
输入 #1
4 3
3 7 12 19
输出 #1
1
思路过程
刚看到这道题n个数里选k个,总往数学里排列组合想,应该有n! / [k!*(n-k)!]种情况,然后一一判断其和是否为素数。这道题的难点主要是选数相加的过程
k=1,有一重循环
k=2,有两重循环
k=3,有三重循环
k=4,有四重循环
…
以此类推。
这个想法光是想一想我就放弃了(当然也看到有人用优化这么做了)。
然后我开始在纸上模拟这个过程。假设n=5,k=3:
1+2+3=6;
1+2+4=7;
1+2+5=8;
2+3+4=9;
2+3+5=10;
…
以升序排列显得清晰多了,一直枚举到头,基本有了个思路:
用for循环模拟这个过程,进行递归;每个式子需要一个头,以此展开计算,同时需要一个sum,计算值;但怎么保证选了k个数才进行判断,最终引入一个变量m,当m==k时再去判断是否为素数。
#include <bits/stdc++.h><