1 条题解

  • 0
    @ 2024-5-25 20:17:39

    思路

    本题目有多种解法。

    • 首先,nn 总共只有 77 个,对于每一个的答案又唯一,所以可以打表。
    • 我们还可以用 88 层循环来暴力枚举。
    • 正解:dfs搜索,我们设dfs(x,dep)为当前要拆分 xx,对于 nn 来说当前正在拆分第 depdep 个数。然后我们需要考虑如何使其不重复,我们每次开始枚举时都从上一个数开始枚举,这样就只会从小到大枚举了。

    AC Code

    法一:打表

    代码来源于洛谷

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n;
    int main()
    {
    	cin>>n;
    	if(n==1)printf("\n");
    		else if(n==2)printf("1+1\n");
    			else if(n==3)printf("1+1+1\n1+2\n");
    				else if(n==4)printf("1+1+1+1\n1+1+2\n1+3\n2+2\n");
    					else if(n==5)printf("1+1+1+1+1\n1+1+1+2\n1+1+3\n1+2+2\n1+4\n2+3\n");
    						else if(n==6)printf("1+1+1+1+1+1\n1+1+1+1+2\n1+1+1+3\n1+1+2+2\n1+1+4\n1+2+3\n1+5\n2+2+2\n2+4\n3+3\n");
    							else if(n==7)printf("1+1+1+1+1+1+1\n1+1+1+1+1+2\n1+1+1+1+3\n1+1+1+2+2\n1+1+1+4\n1+1+2+3\n1+1+5\n1+2+2+2\n1+2+4\n1+3+3\n1+6\n2+2+3\n2+5\n3+4\n");
    								else printf("1+1+1+1+1+1+1+1\n1+1+1+1+1+1+2\n1+1+1+1+1+3\n1+1+1+1+2+2\n1+1+1+1+4\n1+1+1+2+3\n1+1+1+5\n1+1+2+2+2\n1+1+2+4\n1+1+3+3\n1+1+6\n1+2+2+3\n1+2+5\n1+3+4\n1+7\n2+2+2+2\n2+2+4\n2+3+3\n2+6\n3+5\n4+4\n");
    	return 0;
    }
    

    法二:暴力循环

    #include<bits/stdc++.h>
    #define ll long long
    #define db double
    using namespace std;
    ll n;
    int main(){
    	cin>>n;
    	for(ll a=1;a<9;a++){
    		for(ll b=a;b<9;b++){
    			if(a+b==n) printf("%d+%d\n",a,b);
    			for(ll c=b;c<9;c++){
    				if(a+b+c==n) printf("%d+%d+%d\n",a,b,c);
    				for(ll d=c;d<9;d++){
    					if(a+b+c+d==n) printf("%d+%d+%d+%d\n",a,b,c,d);
    					for(ll e=d;e<9;e++){
    						if(a+b+c+d+e==n) printf("%d+%d+%d+%d+%d\n",a,b,c,d,e);
    						for(ll f=e;f<9;f++){
    							if(a+b+c+d+e+f==n) printf("%d+%d+%d+%d+%d+%d\n",a,b,c,d,e,f);
    							for(ll g=f;g<9;g++){
    								if(a+b+c+d+e+f+g==n) printf("%d+%d+%d+%d+%d+%d+%d\n",a,b,c,d,e,f,g);
    								for(ll h=g;h<9;h++){
    									if(a+b+c+d+e+f+g+h==n) printf("%d+%d+%d+%d+%d+%d+%d+%d\n",a,b,c,e,f,g,h);
    			
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }
    

    法三(正解):深搜dfs

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll N=10;
    ll n,a[N];
    void dfs(ll x,ll dep){
        if(x==0){
            if(dep==2)
                return;
            for(ll i=1;i<dep;i++)
                printf("%lld%c",a[i],i==dep-1?'\n':'+');
            return;
        }
        for(ll i=a[dep-1];i<=x;i++){
            a[dep]=i;
            dfs(x-i,dep+1);
        }
    }
    int main(){
        scanf("%lld",&n);
        a[0]=1;
        dfs(n,1);
        return 0;
    }
    
    
    • 1

    信息

    ID
    744
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    90
    已通过
    52
    上传者