2013完美未来之星复赛第二场题目——发放激活码

本文介绍了一种用于游戏测试码生成的算法实现,该算法通过回溯法找出所有可能的数字组合,使得这些数字的和等于指定值C。文章提供了完整的C语言源代码示例,展示了如何通过动态内存分配来高效解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

完美世界最新的客户端游戏大作笑傲江湖最近已经开始测试了,由于希望参与的玩家太多,只能使用激活码的方式让一部分玩家可以参与测试,现在需要一个测试码的生成规则。

如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。

现在希望获得从一组N不同的数字中,获得和为C的组个的个数。组合的个数有可能是1个 有可能是N个 。

输入格式

第一行输入1个整数M,表示总得数据组数。

第二行输入1个整数2 < N < 100,表示需要输入的不同的数字的个数

第三行输入1个整数C ,表示数字的和

第四行输入N个不同数字(数字>0)中间用逗号隔开,   0 <单个数字 <= 100

测试格式

按照和为result的验证码的总数量。

输入样例

2

4

3

11 ,2, 3, 1

3

3

1,2,3

输出样例

2

2

操作系统:ubuntu 11.04

编译软件:gcc

结果截图:

C语言源代码:

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int result(int *,bool *,int,int);
int main()
{
 int M,N,C; //定义题目中要求的变量
 int i,j;   //定义循环用的变量
 //为保存每组结果的数组分配动态内存
 scanf("%d",&M);
 int *sum = (int *)malloc(M*sizeof(int));
 if(NULL == result)
 {
    printf("malloc failed!");
    exit(-1);
 } 
 //求每组数据的结果
 for(i=0;i<M;i++)
 {
    scanf("%d",&N);
    scanf("%d",&C);
    //为输入的数据以及标志位分配动态内存
    int *data = (int *)malloc(N*sizeof(int));
    bool *flag = (bool *)malloc(N*sizeof(bool));
    if(NULL==data || NULL==flag)
    {
       printf("malloc failed!");
       exit(-1);
    }
    //输入每组中的数据 
    for(j=0;j<N;j++)
       scanf("%d,",data+j);
    //将结果保存在sum动态数组中     
    *(sum+i) = result(data,flag,N-1,C);
  }
 //输出每组数据的结果
 for(i=0;i<M;i++)
 {
    if(i == 0)
       printf("%d\n",*(sum+i));
    else
       printf("%d\n",*(sum+i)-*(sum+i-1));
 } 

 return 0;
}

/*
回溯法求随机验证码的相同的个数
*/
int result(int *data,bool *flag,int pos,int C)
{
 //注意这里必须的sum必须定义为static型
 static int sum = 0;
 if(C == 0)
           ++sum;
    else if(C>0 && pos>=0)
 {
     flag[pos] = true;
     result(data, flag, pos-1, C-data[pos]);
     flag[pos] = false;
     result(data, flag, pos-1, C);
 }
     return sum;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值