列表

详情


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;
}

上一题