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