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...