2 条题解
-
0
搜索填数实现组合,递归将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
对每个数来说,有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
- 上传者
