我有这个算法有效,但我想把它改成动态比率,以使第一个位置的值的距离高于最新位置的值。
例如,如果奖金= 1000,total_prizes = 5,last_prize = 50,我得到了:
1) 350.00
2) 275.00
3) 200.00
4) 125.00
5) 50.00
TOTAL SUM: 1000.00
我希望看到的是:
1) 475.00
2) 250.00
3) 150.00
4) 75.00
5) 50.00
TOTAL SUM: 1000.00
而不是在位置之间总是固定值为75.在这种情况下,增加距离接近第一个位置 从5)到4)25 从4)到3)75 从3)到2)100 从2)到1)225
这是当前的代码:
public static void main(String[] aa){
float ratio;
float first_prize;
float s=0;
float money = 1000;
int total_prizes = 5;
float last_prize = 50;
float prizes[] = new float[total_prizes+1];
first_prize=2*(money/total_prizes)-last_prize; //last member of the progresion
ratio=(first_prize-last_prize)/(total_prizes-1);
prizes[total_prizes]=last_prize;
for (int j = total_prizes-1; j >=1; j--) {
prizes[j]=prizes[j+1]+ratio;
}
for(int k=1;k<=total_prizes;k++){
System.out.printf("%d) %.2f\n",k,prizes[k]);
s+=prizes[k];
}
System.out.printf("TOTAL SUM: %.2f\n",s);
}
循环内部:
for (int j = total_prizes-1; j >=1; j--) {
//ratio here should be calculated dynamically based on position...
prizes[j]=prizes[j+1]+ratio;
}
谢谢! :)
答案 0 :(得分:2)
如果我理解你,你想要的是具备以下条件:
1000
。r
几何比例n
。在这种情况下1.75
。25
。我建议您首先创建一个精确的几何序列来解决它,然后将其调整为圆形数字。
第一步很简单,因为所有带n
项的几何系列都是这样的:
x + r * x + r^2 * x + ... + r^(n-1) * x
= x * (1 + r + r^2 + ... + r^(n-1))
= x * (1 + r + r^2 + ... + r^(n-1)) * (r - 1) / (r - 1)
= x * ((r - 1) + (r^2 - r) + (r^3 - r^2) + ... + (r^(n) - r^(n-1)) / (r - 1)
= x * (-1 + (r - r) + (r^2 - r^2) + ... + (r^(n-1) - r^(n-1)) + r^n) / (r - 1)
= x * (r^n - 1) / (r - 1)
所以我们想要
1000 = x * (r^n - 1) / (r - 1)
= x * (1.75^5 - 1) / (1.75 - 1)
= x * (16.4130859375 - 1) / 0.75
= 20.55078125 x
这为我们提供了以下起始解决方案。
48.6599505797377
85.154913514541
149.021098650447
260.786922638282
456.377114616993
之后,这是一个上下调整这些数字以获得所需答案的问题。有很多方法可以做到这一点。一个是简单地从最小的开始并将其移动到四舍五入的数字,并按照其权重按比例重新分配,并继续。这为您提供了以下部分答案序列。
48.6599505797377
85.154913514541
149.021098650447
260.786922638282
456.377114616993
50
85.034965034965
148.811188811189
260.41958041958
455.734265734266
50
75
150.537634408602
263.440860215054
461.021505376344
50
75
150
263.636363636364
461.363636363636
50
75
150
275
450
这不是完全您想要的答案。但它非常接近并希望作为一种策略可以接受。
更新我曾尝试1.75
因为它接近(475/50)^(1/4)
。当我尝试1.8
时,我得到了你想要的答案。
此外请注意,我们不需要生成所有这些中间答案。每次我们只需要最小的术语。由target * (r-1) / (r^n - 1)
给出。每次找到最小的项时,从目标中减去该项,将n
减1,然后重复。