美文网首页
非正常递归(m选n)

非正常递归(m选n)

作者: Vincy_ivy | 来源:发表于2019-05-04 23:26 被阅读0次
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <bits/stdc++.h>
    using namespace std;
    int a[1000001],n,k,flag[1000001],K,Sum;
    //K是要选取的个数,num一开始是0,
    int dfs(int k,int i,int sum)            //k代表第几层循环的意思,因为用暴力遍历不知道要写几层循环,所以用递归做,一般这么多层可能会超时,不过这题过了
    //i是主要的,n-k是用来记录那个数能够选取的范围,比如说它是倒数第三个,他那的位置应该局限在上一个数的位置到倒数第三个数的位置
    {
        int j;
        if(k==0){
            Sum+=sum;
        }
        else{
    //j=i,j等于上一层的下一个数
            for(j=i;j<=n-k;j++)
                dfs(k-1,j+1,sum+a[j]);
        }
        return Sum;
    }
    int main()
    {
        int k,sum=0;
    
        cin>>n>>k;
        for(int i=0;i<n;i++)
            {
                cin>>a[i];
                sum+=a[i];
            }
        if(k==0)
            cout<<"1"<<endl;
        else if(k==1)
            cout<<sum+1<<endl;
        else
            {
                int sum=0;
                for(int i=1;i<=k;i++)
                {
                    Sum=0;
                    sum+=dfs(i,0,0);
                }
                cout<<sum;
            }
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:非正常递归(m选n)

          本文链接:https://www.haomeiwen.com/subject/pnvlnqtx.html