• P1036 选数


    P1036 选数

    题目描述
    已知 nn 个整数 x1,x2,…,xn 
    ,以及11个整数kk(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)

    x_1,x_2,…,x_n (1<=Xi<=5000000)

    输出格式
    屏幕输出,格式为: 11个整数(满足条件的种数)。

    输入输出样例
    输入 
    4 3
    3 7 12 19
    输出 
    1

    最开始的代码:

    #include<iostream>
    #include<cstring>
    #define memzero(a) memset(a,0,sizeof(a))
    using namespace std;
    int n,k,a[21],ans=0,visit[21];
    bool is_prime(int x)//判断是否为素数;
    {
        if(x==1&&x==0)
            return 0;
        bool flag=1;
        for(int i=2;i<=x/2;i++)
            if(x%i==0)
            {
                flag=0;
                break;
            }
        return flag;
    }
    void dfs(int cnt,int sum)
    {
        if(cnt==k+1)
        {
            if(is_prime(sum))
                ans++;
            return;
        }
        for(int i=1;i<=n;i++)
        {
            if(visit[i]!=1)
            {
                visit[i]=1;
                dfs(cnt+1,sum+a[i]);
            }
            visit[i]=0;//释放i;这里很重要;
        }
    }
    int main()
    {
        memzero(visit);
        cin>>n>>k;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        dfs(1,0);
        cout<<ans;
    }

    输入样例后输出13; 发现原来是有重复的数据

    修改:每次取下一个值时从上一个值的下标+1开始取;

    #include<iostream>
    #include<cstring>
    #define memzero(a) memset(a,0,sizeof(a))
    using namespace std;
    int n,k,a[21],ans=0,visit[21];
    bool is_prime(int x)//判断素数;
    {
        if(x==1&&x==0)
            return 0;
        bool flag=1;
        for(int i=2;i<=x/2;i++)
            if(x%i==0)
            {
                flag=0;
                break;
            }
        return flag;
    }
    void dfs(int cnt,int j,int sum)
    {
        if(cnt==k+1)
        {
            if(is_prime(sum))
                ans++;
            return;
        }
        for(int i=j+1;i<=n;i++)//i从j+1开始取值,保证不会重复;
        {
            if(visit[i]!=1)
            {
                visit[i]=1;
                dfs(cnt+1,i,sum+a[i]);
            }
            visit[i]=0;//释放i,这里很重要;
        }
    }
    int main()
    {
        memzero(visit);
        cin>>n>>k;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        dfs(1,0,0);
        cout<<ans;
    }
  • 相关阅读:
    php数组转json 中文编码错乱解决
    fastadmin展示多个视频按钮
    fastadmin在json字段动态关联
    fastadmin放大镜改为“搜索”
    fastadmin行内手机验证规则
    fastadmin批量修改状态
    php手机、邮箱规则验证
    tp5 查询某个值是否在数据表某一个字段中 FIND_IN_SET
    css书写规范以及如何写出赏心悦目的代码
    html5中常见选择器
  • 原文地址:https://www.cnblogs.com/xuanzo/p/12128639.html
Copyright © 2020-2023  润新知