想要打印最后一句话

时间:2018-12-30 05:49:02

标签: java

您必须向糖果店准确投放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;
        }
}
}

3 个答案:

答案 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);

逻辑解释如下:

  • 基本上,我们在此处找到N的模数为5并检查 余数(在示例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。