回 帖 发 新 帖 刷新版面

主题:[讨论]这题怎么做?

选数
【问题描述】已知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)。 
 【输入文件】输入文件为当前目录下的choose.in。
该文件第一行为一个正整数表示有n个数,第二行为整数k(1<=n<=20,k<n),下面的n行分别为x1,x2,……,xn(1 ≤xi≤5000000)这n个数。
 【输出文件】输出文件为当前目录下的choose.out。
该文件只有一个整数,代表计算出和为素数的种数。
 【输入样例】
 4 
3
3
7
12
19
 【输出样例】
 
1
 【运行时限】1秒。【上传文件】上传C语言源程序,以choose.c命名。



高人有源程序吗?
急,作业题..

回复列表 (共2个回复)

沙发

这道题数据量不大,最大18W左右,回溯即可.


板凳

#include <stdio.h>
#include <stdlib.h>

long x[21];
long a[21];
long sum;
int n,k;

int main()
{
    int i;
    input();
    for(i=1;i<=n;i++)
        dp(i,1);    
    output();    
    return(0);
}    

int input()
{
    int i;
    FILE *fp;
    fp=fopen("choose.in","r");
    fscanf(fp,"%d",&n);
    fscanf(fp,"%d",&k);
    for(i=1;i<=n;i++)
        fscanf(fp,"%ld",&x[i]);
    fclose(fp);
}

int dp(int pos,int p)
{
    int i;    
    a[p]=pos;        
    if(p==k)
        add();
    else
        for(i=pos+1;i<=n;i++)
             dp(i,p+1);     
}

int pd(long xx)
{
    int i;
    for(i=2;i*i<=xx;i++)
        if(xx%i==0)
            return(0);
    return(1);        
}        

int add()
{
    int i;
    long s=0;
    for(i=1;i<=k;i++)
        s+=x[a[i]];
    if(pd(s)==1)
        sum++;   
}  

int output()
{
    FILE *fp;
    fp=fopen("choose.out","w");
    fprintf(fp,"%ld",sum);
    fclose(fp);
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册