CMB7. 科室素拓活动
描述
科室素拓进行游戏,游戏规则如下:随机抽取9个人作为游戏参与人员,分别编号1至9,每轮要求k(k<=9且k>=0)个人自由组合使编号之和为n。输出满足规则的所有可能的组合。要求组合内部编号升序输出,组合之间无顺序要求。输入描述
输入数据为以空格分隔的两个整数k和n输出描述
每行输出一个可能的编号组合,组合内部各个编号以空格分隔升序输出。若无满足规则的组合,则输出None示例1
输入:
3 15
输出:
1 5 9 1 6 8 2 4 9 2 5 8 2 6 7 3 4 8 3 5 7 4 5 6
C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-12-23
#include <stdio.h> #include <stdlib.h> int choose(int k,int sum,int begin,int *c_res,int len,int *flag) { int j; for(j=begin+1;j<10;j++) { c_res[len-k]=j; choose(k-1, sum-j,j,c_res,len,flag); } if(k==0 && sum==0) { *flag=1; for(j=0;j<len;j++) printf("%d ",c_res[j]); printf("\n"); } return 0 ; } int main() { int k,n; scanf("%d",&k); scanf("%d",&n); if(k<0 || k>9){ printf("None"); return 0;} if(n<0 || n>45){ printf("None"); return 0; } int *res; int flag; res=(int *)malloc(k*sizeof(int)); choose(k,n,0,res,k,&flag); if(!flag) printf("None"); return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-28
#include <stdio.h> #include <stdlib.h> int choose(int k,int sum,int begin,int *c_res,int len,int *flag) { int j; for(j=begin+1;j<10;j++) { c_res[len-k]=j; choose(k-1, sum-j,j,c_res,len,flag); } if(k==0 && sum==0) { *flag=1; for(j=0;j<len;j++) printf("%d ",c_res[j]); printf("\n"); } return 0 ; } int main() { int k,n; scanf("%d",&k); scanf("%d",&n); if(k<0 || k>9){ printf("None"); return 0;} if(n<0 || n>45){ printf("None"); return 0; } int *res; int flag; res=(int *)malloc(k*sizeof(int)); choose(k,n,0,res,k,&flag); if(!flag) printf("None"); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2019-03-28
#include <stdio.h> #include <stdlib.h> int choose(int k,int sum,int begin,int *c_res,int len,int *flag) { int j; for(j=begin+1;j<10;j++) { c_res[len-k]=j; choose(k-1, sum-j,j,c_res,len,flag); } if(k==0 && sum==0) { *flag=1; for(j=0;j<len;j++) printf("%d ",c_res[j]); printf("\n"); } return 0 ; } int main() { int k,n; scanf("%d",&k); scanf("%d",&n); if(k<0 || k>9){ printf("None"); return 0;} if(n<0 || n>45){ printf("None"); return 0; } int *res; int flag; res=(int *)malloc(k*sizeof(int)); choose(k,n,0,res,k,&flag); if(!flag) printf("None"); return 0; }
C++ 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2018-08-30
#include <iostream> #include <vector> #include <algorithm> using namespace std; void GetKSum(vector<vector<int>>& result, vector<int> gp, int k, int target, int index) { if(k < 0) { return; } for(int i = index; i <= 9; i++) { if(i < target && k > 0) { gp.push_back(i); GetKSum(result, gp, k - 1, target - i, i+1); gp.pop_back(); } else if(i == target && k == 1) { gp.push_back(i); result.push_back(gp); return; } else { return; } } return; } int main() { int k, n; cin>>k>>n; vector<vector<int>> result; vector<int> tmp; GetKSum(result, tmp, k, n, 1); int len = result.size(); if(len != 0) { for(int i = 0; i < len; i++) { for(int j = 0; j < k - 1; j++) { cout<<result[i][j]<<" "; } cout<<result[i][k-1]<<endl; } } else { cout<<"None"<<endl; } return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2019-04-30
#include <stdio.h> #include <stdlib.h> int choose(int k,int sum,int begin,int *c_res,int len,int *flag) { int j; for(j=begin+1;j<10;j++) { c_res[len-k]=j; choose(k-1, sum-j,j,c_res,len,flag); } if(k==0 && sum==0) { *flag=1; for(j=0;j<len;j++) printf("%d ",c_res[j]); printf("\n"); } return 0 ; } int main() { int k,n; scanf("%d",&k); scanf("%d",&n); if(k<0 || k>9){ printf("None"); return 0;} if(n<0 || n>45){ printf("None"); return 0; } int *res; int flag; res=(int *)malloc(k*sizeof(int)); choose(k,n,0,res,k,&flag); if(!flag) printf("None"); return 0; }