2 条题解

  • 0
    @ 2024-4-4 8:53:36

    搜索填数实现组合,递归将1~n的每个数填入a数组,第cnt+1位如果填写了x,那么下一位要从x+1开始尝试:

    #include<bits/stdc++.h>
    using namespace std;
    int n,r,a[30];
    void print() {
    	for(int i=1; i<=r; i++) {
    		printf("%d ",a[i]);
    	}
    	printf("\n");
    }
    
    //cnt存储现在选了多少个数了,x存储上一个选择的数字。
    void dfs(int cnt,int x) {
    	for(int k=x+1; k<=n; k++) { //从上一个选的数字加一开始选,避免数字大小有误
    		a[cnt+1]=k;
    		if(cnt+1==r) {
    			print();//如果已经选完r个数字了,打印。
    		} else {
    			dfs(cnt+1,k);//否则选了cnt+1个数了,上一个选的是k
    		}
    	}
    }
    int main() {
    	scanf("%d%d",&n,&r);
    	dfs(0,0);
    }
    
    • 0
      @ 2024-4-4 8:52:41

      对每个数来说,有2种决策,选或者不选。讨论每个数的2种决策:

      #include <bits/stdc++.h>
      using namespace std;
      int n,r,a[30];
      
      //讨论到了第x个数,选择了cnt个数
      void dfs(int x,int cnt) {
      	if(cnt == r) {
      		for(int i = 1; i <= cnt; i++) {
      			printf("%d ",a[i]);
      		}
      		printf("\n");
      		return;
      	}
      	if(x > n) return;//x出边界
      	a[cnt+1] = x;
      	//当前数保留,选择下一个数
      	dfs(x+1,cnt+1);
      	//当前数不要,选择下一个数
      	dfs(x+1,cnt);
      
      }
      
      int main() {
      	cin>>n>>r;
      	dfs(1,0);//从第1个数开始讨论,选了0个数
      	return 0;
      }
      
      • 1

      信息

      ID
      686
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      3
      已通过
      2
      上传者