5 条题解

  • 0
    @ 2024-4-19 16:39:16

    求组合实际上可以不用标记走过,可以利用下标来,往后走就是

    #include<cstdio>
    #include<iostream>
    #include<algorithm> 
    using namespace std;
    int num[12];
    int mstate[12];
    int n,r;
    void dfs(int top,int numi){
    	if(top==r){
    		for(int k=0;k<top-1;++k) cout<<mstate[k]<<" ";
    		cout<<mstate[top-1]<<endl;
    		return;
    	}
    
    	for(int i=numi;i<n;i++){
    		mstate[top]=num[i];
    		dfs(top+1,i+1);
    	}
    	return;
    }
    int main(){
    
    	cin>>n>>r;
    	for(int i=0;i<n;i++) cin>>num[i];
    	sort(num,num+n);
    	dfs(0,0);	
    	return 0;
    	
    }
    

    顺便写了个组合并且全排列,这时候就需要flag记录了

    #include<cstdio>
    #include<iostream>
    #include<algorithm> 
    using namespace std;
    int num[12];
    int flag[12];
    int mstate[12];
    int n,r;
    int mcount=0;
    void dfs(int top){
    	if(top==r){
    		for(int k=0;k<top-1;++k) cout<<mstate[k]<<" ";
    		cout<<mstate[top-1]<<endl;
    		mcount++;
    		return;
    	}
    
    	for(int i=0;i<n;i++){
    		if(flag[i]!=1){
    		
    		mstate[top]=num[i];
    		flag[i]=1;
    		dfs(top+1);
    		flag[i]=0;
    		}
    	}
    	return;
    }
    int main(){
    
    	cin>>n>>r;
    	for(int i=0;i<n;i++) cin>>num[i];
    	sort(num,num+n);
    	dfs(0);
    	cout<<mcount;	
    	return 0;
    	
    }
    

    信息

    ID
    83
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    278
    已通过
    104
    上传者