1. 程式人生 > >枚舉 天平稱重

枚舉 天平稱重

font strong 所有 rst 輸出 color iostream algorithm pan

天平稱重
【問題描述】
用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。
如果只有5個砝碼,重量分別是1,392781
則它們可以組合稱出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; }

枚舉 天平稱重