[算法]天平称物

Posted rowry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]天平称物相关的知识,希望对你有一定的参考价值。

天平称物

问题描述

有4个砝码,总重量是40克,砝码的质量是整数,且个不相等.请确定他们的质量,使之能称出1-40克任何整数质量的物体.

算法思路

技术图片

注意: 要理清楚嵌套关系

  • 首先是先选出一组砝码中的组合
  • 再选出一组系数的组合
  • 再从1-40逐个进行试探

    代码示例

Python

# 产生一组 (a,b,c,d)
# 然后在1-40中去试探,可以的话就是了

def fn():
    # 首先a+b+c+d=40,且各不相等
    # 根据等式就可以减少一重循环
    for a in range(1, 41):
        for b in range(1, 41):
            for c in range(1, 41):
                # d由等式得到
                d = 40 - a - b - c
                num_tuple = (a, b, c, d)
                if judge(num_tuple):
                    return num_tuple


def judge(num_tuple):
    for x in range(1, 41):
        if not find_result(x, num_tuple):
            break
    else:
        return True
    return False


def find_result(num, num_tuple):
    for x1 in [-1, 0, 1]:
        for x2 in [-1, 0, 1]:
            for x3 in [-1, 0, 1]:
                for x4 in [-1, 0, 1]:
                    result = (x1 * num_tuple[0] + x2 * num_tuple[1] + x3 * num_tuple[2] + x4 * num_tuple[3])
                    # 相等就说明找到了
                    if result == num:
                        return True

    return False


print(fn())

Java

import java.util.Arrays;

public class 天平称物 {
    static int[] operator_arr;

    static void init() {
        operator_arr = new int[] { -1, 0, 1 };

    }

    static int[] fn() {
        int[] result = null;
        for (int a = 1; a <= 40; a++) {
            for (int b = 1; b <= 40; b++) {
                for (int c = 1; c <= 40; c++) {
                    for (int d = 1; d <= 40; d++) {
                        result = new int[] { a, b, c, d };
                        if (judge(result)) {
                            return result;
                        }
                    }
                }
            }
        }

        return new int[] {};
    }

    static boolean judge(int[] result) {
        for (int w = 1; w <= 40; w++) {
            if (!find_result(result, w)) {
                return false;
            }
        }
        return true;
    }

    static boolean find_result(int[] result, int weight) {
        for (int x1 : operator_arr) {
            for (int x2 : operator_arr) {
                for (int x3 : operator_arr) {
                    for (int x4 : operator_arr) {
                        int sum_num = x1 * result[0] + x2 * result[1] + x3 * result[2] + x4 * result[3];
                        if (sum_num == weight) {
                            return true;
                        }
                    }

                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        init();
        System.out.println(Arrays.toString(fn()));
    }
}

以上是关于[算法]天平称物的主要内容,如果未能解决你的问题,请参考以下文章

算法系列之枚举称硬币

基础算法之二——枚举法

POJ2142 The Balance 数论(扩展欧几里得算法)

算法|排序算法-冒泡排序

以下代码片段的算法复杂度

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]