0

这就是我想要做的:我有一个大小为 N 的 double[](N 不会大于 500,但是这个程序的不同应用程序会有不同的 N)。我现在想找出我可以达到给定平均值的组合。例如:

我要查找的数字是 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”。

如何使程序与十个不同返回的数组一起工作?

4

1 回答 1

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。

感觉应该有一种数学方法来解决它(尽管我怀疑有)。

蛮力太慢了。对于 500 种类型,每种最多出现 10000 次,我们说的是 500^10000,这是……很多。

我在考虑CSP爬山

爬山很容易实现——你基本上只是从随机选择一些元素开始,然后添加和删除元素以更接近目标。

整数编程的 wiki 页面有一些有用的信息。

于 2013-01-22T22:29:40.143 回答