题目描述
完美世界最新的客户端游戏大作笑傲江湖最近已经开始测试了,由于希望参与的玩家太多,只能使用激活码的方式让一部分玩家可以参与测试,现在需要一个测试码的生成规则。
如从一组不重复的数字中获得随机几个数字组成验证码,其中只要是这些数字相加的和为相同的那么就认为是同一组验证码,最后希望获得一共有多少组有效验证码。
现在希望获得从一组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;
}