zoukankan      html  css  js  c++  java
  • 蓝桥杯---砝码称重


    5个砝码

    用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
    如果只有5个砝码,重量分别是1,3,9,27,81。则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
    本题目要求编程实现:对用户给定的重量,给出砝码组合方案。
    例如:
    用户输入:
    5
    程序输出:android移动应用程序开发教程
    9-3-1
    用户输入:
    19
    程序输出:
    27-9+1

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


    解题思路:其实就是用暴力的方法去遍历就好了,把每一情况都遍历一下,如果出现了可行的结果就返回。。。

    #include <iostream>
    #include <cstdio>
    #include <memory.h>
    using namespace std;
    int a[14]= {0,81,0,27,-27,0,9,-9,0,3,-3,0,1,-1};
    int mark[5],n;
    int main()
    {
        while(~scanf("%d",&n))
        {
            int temp=0,count=0;
            for(int i=0; i<2; i++){
                count=count+a[i];
                if(temp) break;
                if(count==n){
                    mark[temp++]=a[i];
                    break;
                }
                for(int j=2; j<5; j++ ){
                    if(temp) break;
                    count=count+a[j];
                    if(count==n){
                        mark[temp++]=a[i],mark[temp++]=a[j];
                        break;
                    }
                    for(int k=5; k<8; k++ ){
                        if(temp) break;
                        count=count+a[k];
                        if(count==n){
                            mark[temp++]=a[i],mark[temp++]=a[j],mark[temp++]=a[k];
                            break;
                        }
                        for(int l=8; l<11; l++ ){
                            if(temp) break;
                            count=count+a[l];
                            if(count==n){
                                mark[temp++]=a[i],mark[temp++]=a[j],mark[temp++]=a[k],mark[temp++]=a[l];
                                break;
                            }
                            for(int m=11; m<14; m++ ){
                                if(count+a[m]==n)
                                {
                                    mark[temp++]=a[i],mark[temp++]=a[j],mark[temp++]=a[k],mark[temp++]=a[l],mark[temp++]=a[m];
                                    break;
                                }
                            }
                            count=count-a[l];
                        }
                        count=count-a[k];
                    }
                    count=count-a[j];
                }
                count=count-a[i];
            }
            int i=0;
            while(mark[i]==0) i++;
            printf("%d",mark[i++]);
            for(; i<temp; i++)
                if(mark[i]!=0)
                {
                    printf("%+d",mark[i]);
                }
        }
        return 0;
    }
    上面的代码明显太Low了,所以还是用递归的好点,以后出现多重递归的时候还是尝试着使用递归的方式,因为所有的多重循环都能用递归来实现,这样的话代码就漂亮多了,以后果断不在写超过三重的循环了,太掉价生气




  • 相关阅读:
    avalon ms-repeat avalon1
    抓取各个浏览器引擎关键字,,百度学术关键字
    JS中Float类型加减乘除 修复
    js jquery 权限单选 bug修改以及正确代码 购物车数量加减
    图片加载错误默认显示图片
    文本框中焦点竖杆长度控制
    Go语言中 Print,Println 和 Printf 的区别(八)
    typescript中新增的基本数据类型
    尝试自己搭一个简单的typescript运行环境
    Go语言流程控制中的break,continue和goto(七)
  • 原文地址:https://www.cnblogs.com/zswbky/p/5431987.html
Copyright © 2011-2022 走看看