在Java中最大化所有人员X的总利润
我们有5个整数变量Num、P1、P2、profit_P1和profit_P2,任务是在[1,Num]范围内所有自然数中最大化利润。方法是:如果一个正数能被P1整除,利润增加profit_P1;如果该数能被P2整除,利润增加profit_P2。此外,一个正整数的利润最多只能加一次。
让我们用例子来理解:
输入− int num = 4, P1 = 6, P2 = 2, profit_P1 = 8, profit_P2 = 2;
输出− 最大化所有人员X的总利润 4
解释−这里我们有从1到4([1,Num(4)])的数字
序列中没有数字能被P1整除
1和2能被P2整除
1和2能被P2整除,获得2*2=4的利润
输入− num = 3, P1 = 1, P2 = 2, profit_P1 = 3, profit_P2 = 4
输出− 最大化所有人员X的总利润 10
解释− 1、2和3都能被A整除。
2是给定范围内唯一能被B整除的数。
2能被A和B整除。
1和3能被A整除,获得2 * 3 = 6的利润
2能被B整除,获得1 * 4 = 4的利润
2能被两者整除,但为了最大化利润,它被B而不是A整除。
下面程序中使用的方法如下:
我们得到了6个整数变量,包括正数范围(Num)、表示第一个人P1、表示第二个人P2、表示第一个人利润的profit_P1(即,如果给定数范围内的数字能被P1整除,profit_P1增加),以及类似的profit_P2。
在主函数中调用了一个方法(profitMaximisation),它是所有计算的实用方法。
在函数内部可以看到,每个都能被P1和P2整除的数字,只有当该数字是P1或P2的最小公倍数的倍数时才成立。并且它应该除以能产生更多利润的数字。
因此,这里通过profit_P1 * (num / P1) + profit_P2 * (num / P2) – min(profit_P1, profit_P2) * (num / lcm(P1, P2))计算。
引入了一个CalculateGcd()方法来计算给定数字的最小公倍数。
最终输出在主方法中捕获并显示给用户。
示例
public class testClass{ static int CalculateGcd(int n1, int n2){ if (n2 == 0) return n1; return CalculateGcd(n2, n1 % n2); } static int profitMaximisation(int n, int a, int b, int x, int y){ int result = x * (n / a); result += y * (n / b); result -= Math.min(x, y) * (n / ((a * b) / CalculateGcd(a, b))); return result; } public static void main(String[] args){ int num = 6, P1 = 6, P2 = 2, profit_P1 = 8, profit_P2 = 2; System.out.println("Maximize the total profit of all the persons X "+profitMaximisation(num, P1, P2, profit_P1, profit_P2)); } }
输出
如果运行以上代码,将生成以下输出
Maximize the total profit of all the persons X 12