把面试的逻辑题的倒水问题计算了一下最优解的问题:
/** * 算法及原理 * */ public int[] rsa(int[] data) { /** * 逻辑题:有两个水杯,一个是aL一个是bL,水可以随便用,怎么得到cL * 即用满进满出的原则,要么是aL满倒向bL,要么bL满倒向aL循环得出 * 即 满足:ax-by=c/bx-ay=c * 关于每个水杯满了的次数x/y默认设为不大于100 * */ int a=data[0]; int b=data[1]; int c=data[2]; int sum=0; for(int x=0;x<100;x++) { for(int y=0;y<100;y++) { if(a*x-b*y==c) { sum=x+y; //返回a,b,x,y,sum int [] datas= {a,b,x,y,sum}; return datas; } } } return data; } /** * 调用方法, * 因为有两种可能,即调用两次,第二次把a.b顺序交换赋值 * */ public void use(int[] data) { int a=data[0]; int b=data[1]; int c=data[2]; //交换后调用 int[] data1= {a,b,c}; int[] data2= {b,a,c}; //获取返回的数组 int[] s1 =rsa(data1); int[] s2=rsa(data2); //判断总步数,寻找最优解 if(s1[4]<s2[4]) { String message=s1[0]+"升倒"+s1[1]+"升:x="+s1[2]+",y="+s1[3]; System.out.println(message); }else { String message=s2[0]+"升倒"+s2[1]+"升:x="+s2[2]+",y="+s2[3]; System.out.println(message); } } }
测试例子:
public static void main(String[] args) { dsUtils test=new dsUtils(); //传递两个杯子的容量,以及要取的容量 int[] data= {11,7,2}; test.use(data); }
测试结果:
如果不需要求两种方式中最优解的话,可以不用这么麻烦:
public class dsUtil { /** * 算法及原理 * */ public void rsa(int a,int b,int c) { /** * 逻辑题:有两个水杯,一个是aL一个是bL,水可以随便用,怎么得到cL * 即用满进满出的原则,要么是aL满倒向bL,要么bL满倒向aL循环得出 * 即 满足:ax-by=c/bx-ay=c * 关于每个水杯满了的次数x/y默认设为不大于100 * */ for(int x=0;x<100;x++) { for(int y=0;y<100;y++) { if(a*x-b*y==c) { String message=a+"升倒"+b+"升:x="+x+",y="+y; System.out.println(message); return; } } } } /** * 调用方法, * 因为有两种可能,即调用两次,第二次把a.b顺序交换赋值 * */ public void use(int a,int b,int c) { rsa(a,b,c); rsa(b,a,c); } }
测试结果:
参考:https://www.cnblogs.com/j-star/p/7127190.html