1. 程式人生 > >天平秤重問題(三進位制)

天平秤重問題(三進位制)

[問題描述]:
 有一隻天平和N只砝碼,如何設計這N只砝碼,才能使這天平能夠連續秤出的重量最大?假設砝碼的最小單位為1克,秤物時物品放在天平的左邊,砝碼可以放在右邊也可以放在左邊,不管放在哪一邊只要天平能夠平衡就行,物品的重量應是右邊砝碼總重量減去左邊砝碼的重量。
輸入一個物品的重量,輸出其秤重方案。
 [分析與演算法選擇]:
 這個問題是從一個經典的數學問題變化而來,這個數學問題的大意是:一個物體重40磅,掉在地上後摔成四片,這四片恰好能夠作為砝碼連續秤出40磅以內的物品的重量,這四片的重量如何?
 (1)如何設計砝碼?
 我們先不去看單位,直接用數字來描述。因為要能連續秤出一範圍內的值,所以首先要有1,從數學上可以知道,N只砝碼本身最大能秤的總重就是這N只砝碼的重量和,下面就看如何保證連續的數都能秤出了。設這N只砝碼的重量分別為W1、W2……Wn,且有W1<=W2<=……<=Wn, W1=1,下面看W2如何設計。
 如果W2=1,1、2都能秤出;如果W2=2,1、2、3都能秤出;如果W2=3,1可以秤出(W1)、2可以秤出(W2-W1)、3可以秤出(W2)、4也可以秤出(W1+W2);如果W2=4,則2不能秤出;所以W2最大為3(=3*W1)。
 同理可推出W3最大為9(=3*W2);
 ……
 Wn最大為3n-1(=3*Wn-1)。
 設計方案為這N只砝碼重分別為:1、3、9、27、……、3^n-1。
 (2)如何根據物品重量得到秤重方案?
    物品(+砝碼)         砝碼

因為物品固定放在一連(如左邊),只要考慮砝碼放的情況。任一個砝碼都可能有三種狀態:一是跟被秤物品放在一起(如左邊),二是不放,三是放在物品另一邊(如右邊)。最後物品的重量等於所有砝碼乘上相應係數的和。這個係數可能是:-1、0、1。

先來看3只砝碼時各種重量的稱法,如下表所示,其中-1表示砝碼放在物品一邊、0表示砝碼不放進天平、1表示砝碼放在物品另一邊,如果每一位加1後便只會是0、1、2這3個數字中的一個,所以可以方便地跟三進位制數對應起來:

物品重量

3只砝碼

每一位加1

9

3

1

三進位制數

十進位制數

1

0

0

1

112

14(=1+13)

2

0

1

-1

120

15(=2+13)

3

0

1

0

121

16(=3+13)

4

0

1

1

122

17(=4+13)

5

1

-1

-1

200

18(=5+13)

6

1

-1

0

201

19(=6+13)

7

1

-1

1

202

20(=7+13)

8

1

0

-1

210

21(=8+13)

9

1

0

0

211

22(=9+13)

10

1

0

1

212

23(=10+13)

11

1

1

-1

220

24(=11+13)

12

1

1

0

221

25(=12+13)

13

1

1

1

222

26(=13+13)

由上表我們可以總結出這樣的計算方法:對於給定的物品重量,先確定它最多用到多大的砝碼,假定是3n-1,那麼先將這個物品的重量加上1、3、……3n-1,得到一個數,再對這個數進行除3取餘運算,當餘數為0時表示相應的砝碼跟物品放在一起,餘數為1時表示相應的砝碼不放,為2時表示放在物品的另一邊。

相關推薦

天平秤問題

[問題描述]:  有一隻天平和N只砝碼,如何設計這N只砝碼,才能使這天平能夠連續秤出的重量最大?假設砝碼的最小單位為1克,秤物時物品放在天平的左邊,砝碼可以放在右邊也可以放在左邊,不管放在哪一邊只要天平能夠平衡就行,物品的重量應是右邊砝碼總重量減去左邊砝碼的重量。 輸入一個

Barbells

題意:給你一串b數字。一串p。左右槓鈴需要相等 然後記錄加過重量的槓鈴的重量。如題中所示。 然後對於一個p 可以加左邊 可以加右邊 或者不加三種情況。所以可以用三進位制來表示。 #include<bits/stdc++.h> using namespace s

hdu3001狀壓

題目大意: 現在給你一個有n個點和m條邊的圖,每一條邊都有一個費用,每個點不能經過超過兩次,求所有點至少遍歷一次的最小費用 其中n<=10 m沒有明確限制(肯定不會超過1e5) 一看到這個資料範圍,第一想法就是狀壓QWQ 但是轉念一想,woc,每個點不一定只經過一次咯。 woc,那不就是三進位

51 nod 砝碼稱貪心+轉換思想

現在有好多種砝碼,他們的重量是 w0,w1,w2,...w0,w1,w2,...  每種各一個。問用這些砝碼能不能表示一個重量為m的東西。 樣例解釋:可以將重物和3放到一個托盤中,9和1放到另

隨筆-數字任意轉換為十六

題目: 給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。 注意: 十六進位制中所有字母(a-f)都必須是小寫。 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元’0’來表示;對於其他情況,十六進位制字串

labview字串轉換為ASCII16——二

我們可以得到最後一個字元的ASCII時,通過for迴圈可以將每個資料得到。 這裡講得到的資料轉換為字串拼接起來 字串進行拼接 這裡發現還有一個問題有待解決,如何字串的值小於15時,正常我們的得到ASCIIS是一個字元,但是,實際情況確實2個字元。 例如:我

js任意轉換二進位制,八,十進位制...十六

進位制轉換隻能發生在數字上,也就是Number型別,所以要進行進位制轉換,那就是需要用到Number型別上的方法了,有兩種方法: parseInt(string , radix)或者parseInt(string , radix),前者是全域性的方法,是以前的

杭電acm 1230 火星a+b

                          

Python 3 實現數字轉換成Excel列名10到26的轉換函式

背景:   最近在看一些Python爬蟲的相關知識,講爬取的一些資料寫入到Excel表中,當時當列的數目不確定的情況下,如何通過遍歷的方式講爬取的資料寫入到Excel中。 開發環境: Python 3   openpyxl  解決方案:Excel列名其實就是一個26進位制的

EOJ3650 轉機折扣26,字串

題面 看成26進位制,把較小的那個字串加1 strcmp(s1,s2)s1和s2有大小時,不一定都是返回1或者-1.。。。。這個地方wa了好幾次沒有發現 1 #include<bits/stdc++.h> 2 using namespace std; 3 ch

HDU 2057 - A + B Again16計算

A + B Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 35406 

簡單的遊戲10輪廓線dp

題目: 思路:考慮按順序進行填充,當前位置只受上一個影響和左邊的一個影響。 假設有5列,那麼每一列用一個數來填充,最大是99999,最小是00000. 由於m<=6,所以最大狀態是999999,可以直接從0開始列舉,到999999複雜度為1e6。 dp[sta][cur]

整數轉字串十進位制/十六

程式碼來自:陳碩muduo庫 #include <stdio.h> #include <algorithm> #include <stdint.h> const char digits[] = "9876543210123456789";

P1017 轉換 轉換

和平常的轉化差不多 加多一步 如果餘數 < 0, 那麼餘數減去除數(此時除數是負),商數加1  #include<cstdio> #define _for(i, a, b) fo

高精度加法

1 /* 2 高精度進位制加法 3 n為進位制(n<=36) 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 const int maxn=10000; 8 int n; 9 stru

學校OJ題——字串十六

問題 D: 十六進位制加 時間限制: 1 Sec 記憶體限制: 128 MB 提交: 486 解決: 231 [提交][狀態][討論版] 題目描述 在十六進位制表示中,ABCDEF用於表示十進位制的10、11、12、13、14、15 現輸入兩個表示十六進位制整數的字串,請計算它們相加的結

學以致用——VBA實現十進位制數字轉換為字母二十六Convert a number to letters (Excel Column number to name) with VBA

Excel列標與列名轉換問題,本質上是一個十進位制數和二十六進位制數的轉換問題。記得以前學C、C#、JAVA等程式語言時,已經做過一些相關練習了。但是,老實說,在用公式法解決這個十進位制轉二十六進位制的問題時還真是難到我了,花了好幾個小時也沒有解決。於是,求助網路,在一篇文章

數字轉換成excel列名10到Excel的26的轉換函式

真悲劇!自己寫了3個小時 這個東西居然沒寫出來!汗死!!!! 不過找到了答案,在網上找了好久好多有意思的演算法,但是遇到以Z 結尾的列名時計算錯誤 共享出來大家一起用吧!         /// <summary>         /// 將 Excle 列索

C++標準輸入輸出格式控制

從HDU--2057題說起 剛開始做,以為這題是大數加減問題,試了半天發現太複雜,要考慮的因素太多,後來知道long long能表示16位十六進位制的整數,題目中為15位,可以直接加減,百度了一下輸入輸出十六進位制的格式,還有十六進位制的負數輸出的是其補碼,故要判斷結果

C++ printf列印二進位制,,八,十六利用itoa)

printf是格式化輸出函式,它可以直接列印十進位制,八進位制,十六進位制,輸出控制符分別為%d, %o, %x, 但是它不存在二進位制,如果輸出二進位制可以呼叫stdlib.h裡面的itoa函式。