Loading
NOIP2005 普及组 采药
NOIP2006普及組 開心的金明

NOIP2002普及組 選數

Freddy posted @ 2011年10月08日 02:49 in NOIP with tags c++ NOIP 深度優先搜索 , 1396 阅读

[问题描述]:


已知 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)

[输出]:
格式为:一个整数(满足条件的种数)。
 
[输入输出样例]:
输入:choose.in
4 3
3 7 12 19
输出:choose.out
1

【分析】
排列組合問題,直接深度優先搜索(遞歸)即可。

NOIP2002-choose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int sum=0;//當前總和
int num[21];
int n,k;
int tot=0;
 
bool prime(int num)
{
    if (num==1)return false;
    for (int i=2;i<=(int)sqrt(double(num));i++)
        if (num%i==0)
            return false;
    return true;   
}
 
 
void dg(int dep,int loc)
{
    if(k-dep>n-loc) return;
    if (dep==k+1)
    {
        if (prime(sum))
            tot++;
    }
    if (dep<k+1)
    {
        for (int i=loc;i<=n;i++)
        {
            sum+=num[i];
            dg(dep+1,i+1);
            sum-=num[i];
        }
    }
}
 
int main()
{
    freopen("choose.in","r",stdin);
    freopen("choose.out","w",stdout);
    cin>>n>>k;
    for (int i=1;i<=n;i++)
        cin>>num[i];
    dg(1,1);
    cout<<tot<<endl;
    return 0;
}

正在连接评测机...

 

已连接到评测机

GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty

正在编译...

编译成功

 

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 20 0.026 s 275 KB 0
2 正确 20 0.001 s 275 KB 0
3 正确 20 0.001 s 275 KB 0
4 正确 20 0.001 s 275 KB 0
5 正确 20 0.001 s 275 KB 0

运行完成

运行时间 0.028 s

平均内存使用 275 KB

测试点通过状况 AAAAA

得分:100

恭喜你通过了全部测试点!

NOIP2002-choose
1
 

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter