天平称重 【问题描述】 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。 如果只有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