枚举 天平称重

Posted 豆子

tags:

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

天平称重
【问题描述】
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,392781
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。

本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
例如:
用户输入:
5
程序输出:
9-3-1
用户输入:
19
程序输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。
可以假设用户的输入的数字符合范围1~121

题解:所有的天平,可以分为 减,不加,加,也就是 -1,0,1;所以枚举五个天平 所有这种加或不加,减的可能就可以了。。。然后等于N的,再输出。。可以把把 -1,0,1放在数组中,然后输出时候可以根据数组中数字来进行输出符号。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int wei[] = {81, 27, 9, 3, 1};

int ans;

void solve()
{
    int N;
    cin >> N;
    
    int flag[] = {-1, -1, -1, -1, -1};
    for (flag[0] = -1; flag[0] < 2; flag[0]++)
    {
        for (flag[1] = -1; flag[1] < 2; flag[1]++)
        {
            for (flag[2] = -1; flag[2] < 2; flag[2]++)
            {
                for (flag[3] = -1; flag[3] < 2; flag[3]++) 
                {
                    for (flag[4] = -1; flag[4] < 2; flag[4]++)
                    {
                        int tmp = flag[0]*wei[0] + flag[1]*wei[1] + 
                                  flag[2]*wei[2] + flag[3]*wei[3] + flag[4]*wei[4];
                        if (tmp == N)
                        {
                            bool is_first = true;
                            for (int i = 0; i < 5; i++)
                            {
                                if (flag[i] == -1) {
                                    printf("-%d", wei[i]);
                                }
                                else if (flag[i] == 1) {
                                    if (is_first) {
                                        printf("%d", wei[i]);
                                    }
                                    else {
                                        printf("+%d", wei[i]);
                                    }
                                    is_first = false;
                                }
                            }
                            printf("\n");
                        }
                    }
                }
            }
        }
    }

}

int main()
{
    solve();
    
    return 0;
}

 

以上是关于枚举 天平称重的主要内容,如果未能解决你的问题,请参考以下文章

Java-天平称重

数学与数字2:天平称重问题

p1633[进制应用]砝码称重

Google面试题原理解析 12个乒乓球其中有1个次品,用天平称重3次找出

Google面试题原理解析 12个乒乓球其中有1个次品,用天平称重3次找出

蓝桥杯--砝码称重(dp)