NIOP选数(dfs)

Description

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

 

Input

键盘输入,格式为:

n , k (1<=n<=20,k<n)

x1,x2,…,xn (1<=xi<=5000000)

 

Output

 屏幕输出,格式为:

一个整数(满足条件的种数)。

 

Sample Input

4 3

3 7 12 19

Sample Output

1
#include <stdio.h>
#include <math.h>
int a[25];
int n,k,count;
int panduan(int n)
{
    int i;
    if (n==1)
    return 0;
    int k=(int)sqrt(n);
    for (i=2;i<=k;i++)
        if (n%i==0)
        return 0;
        return 1;

}
int DFS(int a[25],int num,int sum,int l)
{
    int i;
    if (num==k)
    {
       if (panduan(sum))
           count++;
    }
    else
    {
       for (i=l;i<n;i++)
        DFS(a,num+1,sum+a[i],i+1);
    }
}
 int main()
 {
     int i,j;
     scanf("%d%d",&n,&k);
     for (i=0;i<n;i++)
      scanf("%d",&a[i]);
      DFS(a,0,0,0);
      printf("%d\n",count);
      return 0;
 }

### NOIP2008 提高组 概述 NOIP2008(全国青少年信息学奥林匹克联赛)提高组的比赛吸引了众多手参与。该赛事旨在考察参赛者在算法设计、编程实现等方面的能力。 ### 题目概述 比赛共设有四道题目,涵盖了不同的知识点和技术要点: 1. **传纸条** 这是一道经典的动态规划问题,要求计算从矩阵一角到另一角传递消息的最大价值路径[^3]。 2. **双栈排序** 此题涉及据结构的应用,特别是栈的操作及其组合使用来完成特定序列的排序任务[^4]。 3. **笨小猴** 主要测试字符串处理能力以及简单的贪心策略应用,在给定条件下寻找最优解方案[^5]。 4. **火柴棒等式** 属于论范畴,通过调整算术表达式的构成部分使得最终结果满足一定条件下的最大可能性[^6]。 ### 解题思路分析 针对上述各题目的解决方案通常会经历如下思考过程: 对于《传纸条》这类最优化求解类问题,可以采用二维组记录状态转移方程的方式来进行高效解答;而对于像《双栈排序》这样的结构性难题,则需充分理解并灵活运用所掌握的据结构特性,比如利用两个栈模拟队列操作从而达到预期效果;至于《笨小猴》,则更多依赖于对输入模式的理解与快速匹配技巧;最后,《火柴棒等式》考验的是考生们如何巧妙转换视角看待传统学运算规则,并据此构建合理的枚举框架以穷尽所有可行项。 ```cpp // 示例代码片段展示一种可能用于解决“传纸条”的方法 #include <iostream> using namespace std; const int MAXN = 50 + 5; int dp[MAXN][MAXN], a[MAXN][MAXN]; int main() { // 初始化及读入省略... for (int i = n; i >= 1; --i) { for (int j = m; j >= 1; --j) { dp[i][j] = max(dp[i+1][j],dp[i][j+1]) + a[i][j]; } } cout << "The maximum value is:" << endl; cout << dp[1][1]<<endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值