PAT回溯 連續因子(回溯 dp)

2021-09-11 23:00:27 字數 1351 閱讀 8700

l1-006 連續因子 (20 分)

乙個正整數 n 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 5、6、7 就是 3 個連續的數字。給定任一正整數 n,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。

輸入格式:

輸入在一行中給出乙個正整數 n(1輸出格式:

首先在第 1 行輸出最長連續因子的個數;然後在第 2 行中按 因子1因子2……*因子k 的格式輸出最小的連續因子序列,其中因子按遞增順序輸出,1 不算在內。

輸入樣例:

630輸出樣例:

3567

【思路】

一開始,覺得這種拆分因子的題應該純遞迴可以解決,但後來發現,由於乙個整數可以有多種拆分,並且看到題目中說,按最小的連續因子序列輸出,所以我轉變了思路,用回溯法求解。

回溯部分好理解,就是窮舉每乙個可能的數作為因子,如果val == 1了,那麼說明到達邊界,此時就要看看這時的因子序列中,連續因子的數目是多少,如果比之前存的最大值大,那麼就要修改!這裡我用了一點dp的思維求最大連續因子個數

**(最後乙個測試點愣是超時,沒過,去除掉所有素數,還是超時,反正大概思路是這樣):

/*

思想:dfs算了

*/#include

using namespace std;

const

int maxn =60;

int x[maxn]

;int l =1;

int dp[maxn]

;int res[maxn]

;int mi =0;

int ans =0;

bool isprime

(int x)

return true;

}void

dfs(

int val)

//val表示當前的值, len表示當前連續因子的長度

int max_res = dp[1]

;int max_i =1;

for(

int i =

2;i < l;i++)}

if(max_res > ans)

}return;}

//列舉所有可能的因子

for(

int i =

2;i <= val;i++)}

}int

main()

else

cout << endl;

}return0;

}

【執行結果】

連續郵資問題 回溯法

需要注意的是 問題的解空間樹是虛擬的,並不需要在演算法執行時構造一棵真正的樹結構,只需要儲存從根節點到當前節點的路徑。假設某國家發行了n種不同面值的郵票,並且規定每張信封上最多隻允許貼m張郵票。連續郵資問題要求對於給定的n和m,給出郵票面值的最佳設計,在1張信封上貼出從郵資1開始,增量為1的最大連續...

動態規劃回溯 dp回溯查詢可行解

題目背景 三水非常喜歡吃水果撈,但是每次她都吃不完一整盒果撈,就會吃飽,而吃得太飽會不舒服。對於果撈裡的每一塊水果,三水都有不同的喜愛程度。她希望在不吃得太飽的基礎上,可以盡可能多地吃掉自己喜歡的水果。你能幫幫她嗎?題目描述 吃飽的時候三水的飽腹感為w w 10000 w w 10000 w w 1...

神奇的口袋(回溯 DP

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...