枚舉 天平稱重
阿新 • • 發佈:2018-03-20
font strong 所有 rst 輸出 color iostream algorithm pan
天平稱重
【問題描述】
用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。
如果只有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;
}
枚舉 天平稱重