首页 > 其他 > 详细

洛谷OJ P1036 选数

时间:2020-02-12 11:36:35      阅读:72      评论:0      收藏:0      [点我收藏+]
  • 题目描述技术分享图片
  • 输入格式
    技术分享图片
  • 输出格式
    技术分享图片
  • 基本思路

  • 一次选一个数,注意按照升序来选(因为是组合不是排列,避免最终选出的数集重复),采用递归的方式,每选完一个数在调用自身选下一个数,直到递归出口(全部选完)
  • 程序清单

#include<stdio.h>
#include<math.h>
#include<stdbool.h>
int a[20+5]; //数组下标代表数在数组中的位置 
int amt; 
int n,k,js=0;
bool isprime(int x);
void sort(int w,int m); //从上一个数(第w-1个数,位置在m处)开始往后选出下一个数(第w个数)并加入总和,保证不重样 
int main()
{
 scanf("%d%d",&n,&k);
 for(int i=0;i<n;i++)  //输入第0到第n-1共n个数(位置即0到n-1) 
 {
  scanf("%d",&a[i]);
 }
 sort(1,-1); //开始选第一个数,缺省第一个数的上一个数位置为-1 
 printf("%d",js); 
    return 0;
}
bool isprime(int x) //判断素数 
{
 for(int i=2;i<(int)(sqrt(x))+1;i++)
 if(x%i==0&&x!=2) return false;
 return true;
}
void sort(int w,int m)//从上一个数(第w-1个数)的位置m开始选出下一个数(第w个数)并加入总和,保证不重样
{
 if(w-1==k) //判断上一步执行后是否全部选完了 
 {
  if(isprime(amt)) js++;
  return;
 } //全部选出的情况下,如果和为素数则计数加一,否则返回上一步 
 else //直到上一步还没选完,接着选 
 {
  for(int i=m+1;i<=n-1;i++) //从上一个数(位置m)的下一位(位置m+1)开始选,不行就换下下位,依此类推 
  {
   amt+=a[i]; //将这次选出来的数计入总和 
   sort(w+1,i); //选下一个数 
   amt-=a[i]; //每次选完后面的数之后,退回这次选的数 
  } 
 }
 return; 
}

洛谷OJ P1036 选数

原文:https://www.cnblogs.com/BAIDI-HOME/p/12298175.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!