• 砝码组合(dfs)


    砝码组合 

    题目内容:
    用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
    如果只有5个砝码,重量分别是1,3,9,27,81。
    则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
    本题目要求编程实现:对用户输入的重量(1~121),
    给出砝码组合方案(用加减式表示,减代表砝码放在物品盘)。
    例如:
    输入:
    5
    输出:
    9-3-1

    输入:
    19
    输出:
    27-9+1

    要求程序输出的组合总是大数在前小数在后。
    输入描述
    用户输入的重量(1~121),

    输出描述
    给出砝码组合方案(用加减式表示,减代表砝码放在物品盘)。

    输入样例
    19

    输出样例
    27-9+1

    思路:dfs

    1,3,9,27,81 每个数都有三种状态, 即不取, 加上, 减去

    v[i] = 0; //表示不取

    v[i] = 1; //表示加上

    v[i] = -1; //表示减去

    #include <stdio.h>
    #include <string.h>
    
    int v[5], n;
    int s[5] = {1, 3, 9, 27, 81};
    void dfs(int pos, int sum){
        if(sum == n){
            int i = 4;
            while(true){  //找到所取的数中 最大的那个数 根据数据给的范围  只会为加号 
                if(v[i] != 0){
                    printf("%d", s[i]);
                    break;
                }
                i--;
            }
            for(int j = i-1; j >= 0; j--){
                if(v[j] == 1) printf("+%d", s[j]);
                else if(v[j] == -1) printf("-%d", s[j]);
            }
            return;
        }
        if(pos >= 5) return;
    
        // 1、不取
        dfs(pos+1, sum);
        //2、加
        v[pos] = 1;
        dfs(pos+1, sum+s[pos]);
        v[pos] = 0;
        //
        v[pos] = -1;
        dfs(pos+1, sum-s[pos]);
        v[pos] = 0; 
    }
    int main(){
        memset(v, 0, sizeof(v));
        scanf("%d", &n);
        dfs(0, 0);  //从位置 0 开始  起始的和是  0 
        return 0;
    }
  • 相关阅读:
    第一次结对作业
    第一次博客作业
    个人总结
    第三次个人作业
    第二次结对作业
    第一次结对作业
    第一次个人编程作业
    第一次博客作业
    第三次个人作业——用例图设计
    第二次结对作业
  • 原文地址:https://www.cnblogs.com/DDiamondd/p/10681130.html
Copyright © 2020-2023  润新知