2 条题解

  • 5
    @ 2019-01-20 15:24:56

    十个for暴搜即可,O(3^10)复杂度

    
    #include <iostream>
    using namespace std;
    int n,all;
    int main()
    {
        int i,j;
        while(cin>>n)
        {
            all=0;
            if(n<10||n>30) cout<<0<<endl;
            else
            {
                for(int i=1;i<=3;i++)
                    for(int j=1;j<=3;j++)
                        for(int k=1;k<=3;k++)
                            for(int l=1;l<=3;l++)
                                for(int m=1;m<=3;m++)
                                    for(int N=1;N<=3;N++)
                                        for(int o=1;o<=3;o++)
                                            for(int p=1;p<=3;p++)
                                                for(int q=1;q<=3;q++)
                                                    for(int r=1;r<=3;r++)
                                                        if(i+j+k+l+m+N+o+p+q+r==n)
                                                            all++;
                cout<<all<<endl;
                for(int i=1;i<=3;i++)
                    for(int j=1;j<=3;j++)
                        for(int k=1;k<=3;k++)
                            for(int l=1;l<=3;l++)
                                for(int m=1;m<=3;m++)
                                    for(int N=1;N<=3;N++)
                                        for(int o=1;o<=3;o++)
                                            for(int p=1;p<=3;p++)
                                                for(int q=1;q<=3;q++)
                                                    for(int r=1;r<=3;r++)
                                                        if(i+j+k+l+m+N+o+p+q+r==n)
                                                            cout<<i<<" "<<j<<" "<<k<<" "<<l<<" "<<m<<" "<<N<<" "<<o<<" "<<p<<" "<<q<<" "<<r<<endl; 
            } 
        }
        return 0;
    } 
    
  • 2
    @ 2019-01-20 09:04:49

    本题有个小小的坑点:因为每种作料要撒1-3克,共10种作料。所以当总克数小于10或大于30时显然不可以,直接得答案。

    #include<iostream>
    using namespace std;
    int n,kind=0,m1[10000][10],m2[10];
    void rec(int,int);
    int main()
    {
        cin>>n;
        if(n>30||n<10)//直接得答案 
        {
            cout<<0<<endl;
            return 0;
        }
        rec(0,0);
        cout<<kind<<endl;
        for (int j=0;j<kind;j++)
        {
            for (int i=0;i<10;i++) 
                cout<<m1[j][i]<<" ";
            cout<<endl; 
        }
        return 0;
    }
    void rec(int total,int depth)//10-30时暴力深搜 
    {
        if (depth==10)
        {
            if (total==n) 
            {
                for (int j=0;j<10;j++) 
                    m1[kind][j]=m2[j];
                kind++;
            }
        }
        else if (total>=n) 
            return ;
        else
        {
            for (int i=1;i<=3;i++)
            {
                m2[depth]=i;
                rec(total+i,depth+1); 
            }
        }
    }
    
  • 1

信息

难度
5
分类
(无)
标签
(无)
递交数
122
已通过
41
通过率
34%
被复制
7
上传者