【LEETCODE】【鱼缸难题】
题目描述
最近小华买了n条金鱼,小华想买一些鱼缸去装他们,商店有两种鱼缸
第一种:每个鱼缸价格是c1元,可以装n1条鱼
第二种:每个鱼缸价格是c2元,可以装n2条鱼
小华想要把所有的鱼都养在买的那些鱼缸中,而且每个鱼缸都要装满鱼,小华很难计算出两种鱼缸各买多少个最实惠(总花费最少),请你使用程序帮小华计算出最实惠方案。
解答要求
时间限制:1000ms, 内存限制:100MB
输入
每个用例包含三行
第一行为整数n
第二行为c1,n1
第三行为c2,n2
所有数的范围均为[1,2000000000]
输出
每个用例占一行,对于不存在解的情况请输出”failed”(即不能满足所有的鱼都被装在鱼缸中且每个鱼缸都装满)
否则,请输出两个整数m1,m2表示第一种鱼缸买m1个,第二种鱼缸买m2个。保证解是唯一的。
样例
输入样例 1 复制
43
1 3
2 4
输出样例 1
13 1
提示样例 1
提示
解题报告:
显然问题是二元一次不定方程m1n1+m2n2=n的整数解。又有,要求总费用最小,那么,如果c1/n1比c2/n2要小,显然,我们应该让n1尽可能大。反之,让n2尽可能大。
求解该方程使用“扩展欧几里得”算法就可以了。
public static void main(String[] args) {
// please define the JAVA input here. For example: Scanner s = new Scanner(System.in);
Scanner s = new Scanner(System.in);
long n = s.nextLong();
long c1 = s.nextLong();
long n1 = s.nextLong();
long c2 = s.nextLong();
long n2 = s.nextLong();
if (n1 > n || n2 > n){
System.out.println("failed");
}
long x = 0;
long y = 0;
long min = Long.MAX_VALUE;
for (long i = 0; i< n/n1+1; i++){
for (long j=0;j<n/n2+1;j++){
if (i*n1+j*n2==n && min > i*c1+j*c2){
x = i;
y = j;
min = i*c1+j*c2;
}else if (i*n1+j*n2<n){
continue;
}else if (i*n1+j*n2>n){
break;
}
}
}
if (x==0 && y==0){
System.out.println("failed");
}else{
System.out.println(x+" "+y);
}
// please finish the function body here.
// please define the JAVA output here. For example: System.out.println(s.nextInt());
}