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