五個砝碼問題,三種解法

2021-06-13 11:52:44 字數 2322 閱讀 9150

5個砝碼

用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。

如果只有5個砝碼,重量分別是1,3,9,27,81。則它們可以組合稱出1到121之間任意整數重量

(砝碼允許放在左右兩個盤中)。

本題目要求程式設計實現:對使用者給定的重量,給出砝碼組合方案。

例如:使用者輸入:

5程式輸出:

9-3-1

使用者輸入:

19程式輸出:

27-9+1

要求程式輸出的組合總是大數在前小數在後。

可以假設使用者的輸入的數字符合範圍1~121。

方法一:遞迴求解

可以發現,在輸出的表示式中第乙個輸出的數不可能是負數,所以首先我們從最大的數81開始,直到得到滿足題意的數。如:輸入5,輸出9-3-1,第乙個滿足的是9;輸入19,輸出27-9+1,第乙個數是27等。確定第乙個數之後再與比這個數小的數(最接近這個數的數)相加,若不滿足則相減,然後取滿足的運算結果繼續重複之前的運算。

**如下:

#includeint n;//輸入的數

int temp[6] = ;//儲存5個砝碼

//result儲存當前運算結果,i表示當前所需最大砝碼下標,

//sum的作用是這樣的:當我們選擇81的時候,其餘數之後為sum=1+3+9+27,如果81-40大於n,

//則結束後面的遞迴。例如輸入5,從砝碼81開始判斷,直到砝碼9才滿足,此時sum=1+3=4,因

//為9-sum=9-4=5不大於5,所以滿足,繼續後面的運算。sum就是儲存小於當前所選砝碼的重量和。

//can陣列用來儲存滿足題意的計算過程。

void fun(int result,int i,int sum,int can)

else if (can[k] < 0)

}printf("\n");

} else if (result - sum > n)//判斷有沒必要繼續後面的計算

else

can[i] = -temp[j];//儲存過程

fun(result - temp[j],j - 1,sum,can);//相減

can[i] = 0;//都不滿足,歸零

} }}int main()

; scanf("%d",&n);

fun(0,5,121,can);//開始遞迴求解

return 0;

}

方法二:迭代法

這個看下**應該就明白了,**如下:

#include int main()

; int b[3] = ;

int c[3] = ;

int d[3] = ;

int e[3] = ;

int h,i,j,k,m,n;

scanf("%d",&n);

for (i = 0; i < 3; i++)

for (j = 0; j < 3; j++)

for (k = 0; k < 3; k++)

for (m = 0; m < 3; m++)

for(h = 0; h < 3; h++)

}for (i = 0; i < 5; i++)

printf("\n");

return 0;

}

方法三:巧妙利用3進製

首先,為啥用3進製呢,可以看看題目這組資料,你就會發現:3^0 = 1,3^1 = 3,3^2 = 9,3^3 = 27,3^4 = 81。

然後,將輸入的數轉換成3進駐,如19的三進製為201,我們同時可以發現,每乙個三進製位上的數表示有幾個相應的砝碼。如三進製201表示有

2個砝碼9,乙個砝碼1,所以2 * 9 + 1 = 19。同樣我們如果輸入5,三進製為12,表示有乙個砝碼3,兩個砝碼1,所以3 + 2 * 1 = 5。但題目要求每個砝碼

只用一次,那怎麼辦呢?你可以發現三進製每個位上只有三種可能,要麼是0,要麼是1,要麼是2,再想想方法二,是不是明白得差不多了?三種狀態如何處理呢?

首先轉換成三進製,然後從末尾起檢視每一位,對於第i位來講(i從0開始)

1. 如果是1,則相當於用3的i次方1次

2. 如果是2,則相當於用3的i次方作為減法1次,並且向高位進1

3. 如果是0,則不需要用到3的i次方

如輸入19,三進製為201,從最後一位開始,首先是1,則記+3^0;第二位為0,不處理;第三位為2,則記-3^2,向高位進一,那麼第四位從0變成1,記+3^3。

一綜合即為:3^3 - 3^2 + 3^0 = 27 - 9 + 1 = 19;

**就不詳細列出了,讀者可以試試看,應該比較容易實現。

子集問題的三種解法

1.按目標向量列舉 列舉目標向量每個分量上的可取值 1 全子集 def dfs x,t,s,start print x t for i in xrange start,len s x t s i dfs x,t 1,s,i 1 2 特定大小子集 def dfs x,t,s,start if t le...

八皇后問題的三種解法

會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2 b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道8皇后...

LetCode PlusOne的三種解法

原題目 given a number represented as an array of digits,plus one to the number.題目的意思是乙個用陣列表示的數字,在加一後仍然用這個陣列表示,加一後位數可能會增加,故最好用vector表示.class plusone priva...