您必须向糖果店准确投放N公斤糖。制糖厂生产的糖装在袋子里。袋子有3公斤袋和5公斤袋。 我尝试携带尽可能少的行李。例如,当您需要运送18公斤的糖时,您可以装6袋3公斤的糖,但是如果您运送3公斤和3公斤的糖,则可以运送更少的糖。 编写一个程序,找出必须精确输送N公斤糖时应带多少袋。 (3 <= N <= 5000 AND并且如果不能精确表示N公斤,则打印-1。)
在只有4或7的情况下,它没有被划分,所以我将其打印为-1。 为了获得最小的包装袋,我使用了以下代码。 但是,当我运行此命令时,如果不将其除以5或3,应该打印出最下面的句子,但它不起作用。 我想知道它是如何工作的。谢谢。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = input.nextInt();
if (N % 5 == 0) {
System.out.println(N / 5);
} else if (N == 4 || N == 7) {
System.out.println(-1);
} else
for (int i = 1; (N - 3 * i) % 5 != 0; i++) {
if ((N - 3 * i) % 5 == 0)
System.out.println(i + (N - 3 * i) / 5);
break;
}
}
}
答案 0 :(得分:2)
您的解决方案似乎存在逻辑问题。尝试以下操作:
boolean isPossible = true;
if (N % 5 == 0) {
System.out.println("You need : " + (N / 5) + " bags");
} else {
int diff = 0;
for (int i = N; i > 0 && N >= 0; i--) {
if (N % 5 != 0) {
diff = N % 5;
N = N - diff;
} else {
if (diff % 3 == 0) {
System.out.println("You need : " + (N / 5 + diff / 3) + " bags");
isPossible = true;
break;
} else {
N = N - 5;
diff = diff + 5;
}
}
}
}
if (N <= 0 || !isPossible)
System.out.println(-1);
逻辑解释如下:
diff
中)是3的倍数。diff
)不是3的倍数,则我们将N减少
5,然后将diff
增加5。这一直持续到我们找到匹配项(isPossible
)为止,否则打印出-1
。答案 1 :(得分:1)
据我所知,您正在尝试在最后一个for循环中使用最少的3kg袋子,并且您希望在其余部分被5kg整除时立即爆发。
(int i = 1; (N - 3 * i) % 5 != 0; i++)
你中间没有i <5吗?
(int i = 1; i < 5; i++)
此外,您可以摆脱if条件 如果(N%5 == 0){
以0开头的i表示部分,因此您要考虑N被5整除的情况:
(int i = 0; i < 5; i++)
答案 2 :(得分:0)
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int sum = 0;
boolean isFound = false;
for (int i = 0; i < N / 2; i++) {
for (int j = 0; j < N / 2; j++) {
if ((5 * i) + (3 * j) == N) {
sum = i + j;
isFound = true;
}
}
}
if (isFound ) {
System.out.println("You require " + sum + " bags");
} else {
System.out.println(-1);
}
说明:
上面的代码旨在找到给出数字的3和5因子之和的可能组合,即N:
例如: N = 32
对于每次迭代,都会检查以下条件。
if((5 * i) + (3 * j) == N)
检查将继续进行,直到找到满足条件的最小数字为止。
5 * 0 + 3 * 0 = 0,不等于32
5 * 0 + 3 * 1 = 3,不等于32
5 * 0 + 3 * 2 = 6,不等于32
。
5 * 1 + 3 * 0 = 5,不等于32
5 * 1 + 3 * 1 = 8,不等于32
5 * 1 + 3 * 2 = 11,不等于32
5 * 1 + 3 * 4 = 17,不等于32
。
5 * 4 + 3 * 0 = 20,不等于32
5 * 4 + 3 * 1 = 23,不等于32
5 * 4 + 3 * 2 = 26,不等于32
5 * 4 + 3 * 3 = 29,不等于32
5 * 4 + 3 * 4 = 32
在这种情况下,i = 4和j = 4,即所需的行李总和(i + j)= 8
isFound设置为true表示已找到该组合。
如果未找到任何组合,则isFound仍为false,并打印-1。