枚举 天平称重

天平称重
【问题描述】
用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81
则它们可以组合称出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;
}

原文地址:https://www.cnblogs.com/douzujun/p/8605915.html

时间: 2024-08-30 00:34:40

枚举 天平称重的相关文章

天平称重

1. 给你 8 颗小石头和一架天平.其中有 7 颗石头重量是一样的,另外一个比这 7 颗略重.请问在最坏的情况下,最少要称几次,才能把这颗较重的石头找出来. 首先任取其中6个小石头一边3个进行称重,如果重量相等,再称剩下两个即可找出重的:如果不相等,取较重的一边的任意2个称重,如相等则剩下的1个是重球,如不相等则较重的是. 3+3,如果相等,剩下2个一次OK:如果不相等,较重的3个采取1+1,如果相等,剩下的1个即为结果,否则1+1中较重的1个即为结果. 2. 12球问题是指有十二个球,其中十一

蓝桥杯——说好的进阶之砝码称重(贪心算法)

5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案. 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数在后. 可以假设用户的输入的数字符合范围1~121. public static void main(String

Java-天平称重

题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). 本题目要求编程实现:对用户给定的重量,给出砝码组合方案.例如:用户输入:5程序输出:9-3-1用户输入:19程序输出:27-9+1 要求程序输出的组合总是大数在前小数在后.可以假设用户的输入的数字符合范围1~121. 思路: 源代码: 运行结果: 原文地址:https://www.cnblogs.com

hdu 1709 求天平不能称重的重量 动态规划

给定一个天平和n个砝码,每个砝码都有一个重量,求出从1到这些砝码的总和之间不能被天平表示的重量.天平可以两端放砝码. 动态规划做法,看网上都是母函数,真心不懂.. dp[i]如果是0表示这些砝码不能称重i重量,如果是1表示能称重i重量. 对于每个砝码,假设当前砝码重量是b[i],那么j从最大值开始,减小到b[i], 如果存在一个dp[j-b[i]]为1,说明当前的j能被组成. j逆着循环的原因是由于每个砝码只有 一个,类似于01背包与完全背包的样子, 如果正向循环会导致每个物品可能使用多次,逆向

砝码称重问题二

题目描述 有一组砝码,重量互不相等,分别为m1.m2.m3……mn:它们可取的最大数量分别为x1.x2.x3……xn. 现要用这些砝码去称物体的重量,问能称出多少种不同的重量. 现在给你两个正整数列表w和n, 列表w中的第i个元素w[i]表示第i个砝码的重量,列表n的第i个元素n[i]表示砝码i的最大数量.  i从0开始                   请你输出不同重量的种数.如:w=[1,2], n=[2,1], 则输出5(分析:共有五种重量:0,1,2,3,4) 解题 参考智力题砝码称重

51nod 1449 砝码称重 (进制思想)

1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个.问用这些砝码能不能表示一个重量为m的东西. 样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中. Input 单组测试数据. 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9). Output 如果能,输出YES,否则输出NO.

【算法系列之枚举】称硬币

题目 有12枚硬币.其中有11枚真币和1枚假币.假币和真 币重量不同,但不知道假币比真币轻还是重.现在, 用一架天平称了这些币三次,告诉你称的结果,请你 找出假币并且确定假币是轻是重(数据保证一定能找 出来). 输入 第一行是测试数据组数. 每组数据有三行,每行表示一次称量的结果.银币标号 为A-L.每次称量的结果用三个以空格隔开的字符串表示: 天平左边放置的硬币 天平右边放置的硬币 平衡状态.其 中平衡状态用``up'', ``down'', 或 ``even''表示, 分 别为右端高.右端低

J - 砝码称重 改自51nod1449

J - 砝码称重 Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 128000/64000 KB (Java/Others) Submit Status Problem Description 有一个物品和一些已知质量的砝码和天平,问能不能用这些砝码称出这个物品的重量(天平两边都可以放砝码) Input 多样例输入,样例数<=20000 对于每个样例: 第一行输入两个数n,m,表示砝码数量和重物质量,1 ≤ m ≤ 1018 第

C程序设计的抽象思维-递归过程-砝码称重

[问题] 在狄更斯时代,商人们用砝码和天平来称量商品的重量,如果你只有几个砝码,就只能精确地称出一定的重量.例如,假定只有两个砝码:分别是1kg和3kg.只用1kg的砝码可以称出1kg重量的商品,只用3kg的砝码可以称出3kg重量的商品.1kg和3kg的砝码放在天平同一边可以称出4kg重量的商品,放在不同边可以称出2kg重量的商品.因此利用这两个砝码,我们可以称出重量分别为1.2.3.4kg的商品. 编写一个递归函数: bool IsMeasurable(int target, int weig