一道非常好的搜尋題目。要將任意乙個數拆分成斐波那契數的和,想到用搜尋從前往後依次拆分驗證,因為輸出要求,我們可以巧妙地用字串的形式儲存結果。
考慮到dfs的可行性和最優性剪枝,我們可以增加乙個變數t儲存當前已經拆分的個數,如果當前拆分的個數已經大於了所求的最小值,那就沒必要再搜尋了,具體細節見注釋。
小技巧:用讀入流stringstream 進行整數到字串的轉化
#include
#include
#include
#include
#include
using
namespace
std;
int f[50],n,minn;
string ans;
void dfs(int x,int t,int sum,string str)
if (t>minn||sumreturn ;//剪枝,如果當前的sum小於要拆分的斐波那契數,顯然是不合法的;
stringstream ss;//數字轉換成字串
string s;
ss<>s;
if (n!=f[x]||n==1)
}int main()
dfs(1,0,n,"");
if (ans[0]==' ') ans.erase(0,1);//刪除多餘空格
cout
0;
}
整數拆分問題
問題 對於1個正整數n,將其拆分成幾個正整數的和,如何拆分可使得其乘積最大?csdn使用者pathuang68給出的結論是 如果不在乎是否為整數的話,那麼把每份平均分為e 2.71828459045.時,所得到的乘積是最大的,如果要是整數的話,那麼就選盡可能地靠近e的整數即可,比如3。具體證明請參見...
190512 整數拆分
題目描述 乙個整數總可以拆分為2的冪的和,例如 7 1 2 4 7 1 2 2 2 7 1 1 1 4 7 1 1 1 2 2 7 1 1 1 1 1 2 7 1 1 1 1 1 1 1 總共有六種不同的拆分方式。再比如 4可以拆分成 4 4,4 1 1 1 1,4 2 2,4 1 1 2。用f n...
pta 整數拆分
給定乙個整數n,將其無序拆分成最大數為k的拆分數,n,k不超出100 要求 所有的拆分方案不重複。如當n 4,k 4時,一共有5種拆分方案,拆分如下 1 4 1 1 1 1 2 4 1 1 2 3 4 1 3 4 4 2 2 5 4 4輸入格式 每一行輸入一組整數n,k,遇到鍵盤結束符 z或檔案結束...