1 int array[20];
2 int cSum;
3 int iTotal;
4 scanf("%d",&cSum);
5 int used[20];
6 for(int i = 0;i<cSum; i++)
7 {
8 int number = GetUniqueNumber(i);
9 iTotal += number;
10 }
11 printf("%d",iTotal);
12
13 int GetUniqueNumber(int i)
14 {
15 int index = rand();
16 while(index in used[20])
17 {
18 index = rand();
19 }
20 reutrn array[index];
21 }
我上面写的只是伪码,请见谅!
建立一个数组,把20个数据放到数组里,然后把再进行组合。
我现在就是要这个组合的算法,能详细些吗?
不重复主要是指的什么不重复 不是太明白
表述有问题,不重复主要是表现在随机取数中的,这里可以忽略不考虑的.
新建一个数组,把原来数组不重复的数字放入新数组。
计算的时候 直接用新数组计算~
//参数:int[]:将20个数据放入数组中
//参数:要抽取多少个
//最后返回结果 抽取数的和
public int GetRandomSum(int[] array,int num)
{
int count = 0;
string ran = "";
bool result=false;
Random random = new Random();
for (int j = 0; j < num; j++)
{
int len = random.Next(array.Length);
if (ran == "")
{
ran = len + "|";
count += array[len] ;
num--;
}
else
{
string[] ranlist = ran.Split('|');
foreach (string rl in ranlist)
{
if (rl != "")
{
result = rl == len.ToString() ? false : true;
if (!result)
{
break;
}
}
}
}
if (result)
{
count += array[len] ;
ran += len + "|";
}
else
{
num++;
}
}
return count;
}
1: 放到一个数组中,比如 int[20] ints;
2: 第一次随机范围 0~19,把随机数当作下标,从数据中取出, 然后把这个数和 ints[19]交换
3:第二次随机范围 0~18,把随机数当作下标,从数据中取出, 然后把这个数和 ints[18]交换
这是经典的洗牌算法!
用dfs 或者 二进制枚举,很简单的哈
新建一个数组,把原来数组不重复的数字放入新数组,就可以计算了啊