这是我想要做的: 我有一个大小为N的双[](N不会大于500,但该程序的不同应用程序将具有不同的Ns)。我现在想知道我可以达到给定平均值的组合。例如:
我寻找的数字是3.双数组中只有2个项目{6,2}
程序应循环并告诉我1x [0]和3x [1] = 6 + 2 + 2 + 2/4 = 3是最简单的方法。我还想将这些因素限制在最大值10,000(即最大值为10,000 [0] +10,000 [1])
我正在试验嵌套的while循环,但无法让它工作。请快点开始吧?
感谢
编辑:这是我到目前为止所拥有的。它适用于两个给定的组合,但由于每个因素都需要一个for循环,所以实施起来会令人费解。
public class Test {
public static void main(String[] args) {
double[] returns = {6,2};
double givenReturn = 3;
double maxStock = 5000;
double calcReturn = 0;
for (int a = 0; a < maxStock && (givenReturn != calcReturn); a++) {//first level
for (int b = 0; b < maxStock && (givenReturn != calcReturn); b++) {//second level
calcReturn = (a*returns[0]+b*returns[1])/(a+b);
if(calcReturn == givenReturn){
System.out.println(a+" "+b);
break;
}
}
}
}
}
程序成功打印:“1 3”。
如何使用十个不同的返回数组来使程序工作?
答案 0 :(得分:0)
为了便于参考,您的问题以数学方式进行:
Given an integer T and a vector c (|c| <= 500), solve for vector a and integer b:
(all numbers are non-negative integers)
a0.c0 + a1.c1 + a2.c2 + ... = T.b
a0 + a1 + a2 + ... = b
each ai <= 10000
b > 0
Additional constraint: minimize b
对于你的例子:
c
为{6,2},T
为3,a
为{1,3},b
为4。
感觉应该有mathematical方法来解决它(尽管我怀疑有)。
蛮力太慢了。对于500种类型,每种情况最多10000次,我们说的是500 ^ 10000,这是......很多。
我在考虑CSP或hill climbing。
爬山很容易实现 - 你基本上只是从一些随机选择的元素开始,然后添加和删除元素以更接近目标。
The wiki page on integer programming有一些有用的信息。