【发布时间】:2018-04-19 16:10:55
【问题描述】:
对于给定的问题陈述,什么必须是有效的算法? (首选java)
找到一个由 N 个数字组成的集合 S,使得它们的总和等于 M。集合 S 中的每个数字必须落在与平均 M/N 的给定偏差“D”之内。
int M= 100;
int N= 10;
int D= 3;
这里 M/N 的平均值 = 10。因此,偏差为 3,N 可以是 {7,8,9,10,11,12,13} 中的数字之一
结果必须和这个集合类似:
11 11 9 8 11 9 11 11 9 10
下面是程序,我到现在为止:
public class RandomNumberGenerator {
public static void main(String args[]) {
Random r = new Random();
int sum = 100;
int numbers = 10;
int deviation = 3;
int iterator = 0;
int sumTemp = 0;
int storeArray[] = new int[numbers];
int average = Math.round((float) sum / (float) numbers);
int numberOfAttempts = 0;
int discardedBecauseGreater = 0;
System.out.println("Average is " + average);
while (iterator < numbers) {
int temp = r.nextInt(average + deviation);
if (temp > average - deviation) {
storeArray[iterator] = temp;
sumTemp += temp;
iterator++;
}
if (iterator == numbers) {
if (sumTemp == sum) {
System.out.println("Got the result " + sumTemp);
System.out
.println("Number of attempts " + numberOfAttempts);
System.out.println("Discarded because of greater "
+ discardedBecauseGreater);
for (int i = 0; i < numbers; i++) {
System.out.println(storeArray[i]);
}
break;
} else {
numberOfAttempts++;
sumTemp = 0;
iterator = 0;
}
}
if (sumTemp > sum) {
discardedBecauseGreater++;
sumTemp = 0;
iterator = 0;
}
}
}
}
【问题讨论】:
-
使用当前公式
{10,10,10,10,..}是最简单的解决方案。 -
@JohnColeman 这不是子集总和(我假设这是您所指的 NP 完全问题),因为您可以自己在某个范围内得出数字,而不是选择他们从一个集合中提取出来,尽管这个问题在这个阶段似乎还不够明确,无法回答。