先指出一下楼主你给出的数据是没办法做
500000(50万)个数最大值时20,要求和为80000000(8千万)
500000x20=10000000(1千万)连一半都不到,更何况20只能出现10000次...
要求完成这个算法没有难度,只不数据量过于庞大,对程序员来说没有难度,但是对设备来说压力不小
追问你已看出举例有问题,说明你已经理会我的意思。我要的是一个通用的算法,一段实现这个功能的java代码。你能给出一个合理的代码不?
追答public static void main(String[] args){
//条件修改为:总和为800,最大值20,共50个数,20最多出现10次
final int count = 800; //总和
final int max = 20; //最大值
final int m = 10; //最大值出现次数
final int n = 50; //数字数
int [] array = new int [n];
int num = m;
int sum = count;
Random random = new Random();
//先随机为array所有变量赋值
for(int i = 0; i < n; i++){
do{
if(sum >= max)
array[i] = random.nextInt(21);
else
array[i] = random.nextInt(sum+1);
}while(num <= 0 && array[i]==max);
if(array[i]==max)num--;
sum -= array[i];
}
//如果结束后结果并不是所要的最大值,随机将某一位上的数补1,直至达到要求
while(sum > 0){
int a = random.nextInt(50);
if (array[a] != max){ //
if(array[a]==(max-1) && num > 0){
num--;array[a]++;sum--;
}else if(array[a] < (max-1)){
array[a]++;sum--;
}
}
}
for(int i = 0; i < n; i++){
System.out.print(""+array[i]+" ");
if((i+1)%10 == 0)System.out.print("\r\n");
}
}本回答被提问者采纳