本题地址:
题目描述
已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<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:4 3 3 7 12 19输出样例#1:
1
用dfs的时候一定要注意局部变量单独定义啊!尤其是i,吃了多少亏了。
简单的dfs,数据较弱,不要考虑排列组合,下面结合代码解析
var a:array[0..25]of longint;
n,k,i,j,sum,ans:longint;
f:array[0..25]of boolean;
function su(x:longint):boolean;
var i:longint;
begin
for i:=2 to trunc(sqrt(x))do
if x mod i=0 then exit(false);
exit(true);
end;//判断是否为素数
procedure dfs(x,p:longint);//x表示当前所选的k中第x个数,p表示在队列中选择的位置,只进不退
var i:longint;
begin
if x>k then
begin
if su(sum) then inc(ans);
exit;
end;
for i:=p to n do
if f[i] then
begin
f[i]:=false;
inc(sum,a[i]);
dfs(x+1,i+1);
dec(sum,a[i]);
f[i]:=true;
end;
end;//dfs术
begin
readln(n,k);
fillchar(f,sizeof(f),true);
for i:=1 to n do
read(a[i]);
dfs(1,1);
writeln(ans);
end.