深搜剪枝 數的劃分

2021-08-21 20:28:29 字數 759 閱讀 4408

時間限制: 1 sec  記憶體限制: 128 mb

提交: 16  解決: 10

[提交][狀態][討論版][命題人:add_cy]

將整數n分成k份,且每份不能為空,任意兩種劃分方案不能相同(不考慮順序)。

例如:n=7,k=3,下面三種劃分方案被認為是相同的。

1 1 5

1 5 1

5 1 1

問有多少種不同的分法。

n,k (6乙個整數,即不同的分法

7 3
4
因為題目無序排列,115,151,511這三種劃分都看成1種,因此可以令劃分過程中後乙個數不小於前乙個數,「下界」為a[i]>=a[i-1]。假設已經將n劃分成了a[1]+a[2]+……a[i-1],劃分第i份時剩下數的大小為n-(a[1]+a[2]+……a[i-1]),令m=n-(a[1]+a[2]+……a[i-1]),因為劃分是乙個遞增的過程,所以a[i]最大值為剩下k-i+1份的平均數「上界」為m/(k-i+1)

#include#include#include#include#include#includeusing namespace std;

int n,k,ans=0;

int a[7];

void dfs(int j)//分到第j份

for(int i=a[j-1];i<=n/(k-j+1);i++)//第j份的上下界

}int main()

深搜的剪枝

深搜前面已經講過,對於剪枝,就是把沒必要的步驟進行if特判剪枝,用好了可以大大的優化複雜度 這裡就根據兩個例題來講吧 詳情見 include include include intn,k int f 210 7 int main printf d n f n k 輸出最大值 return0 詳情見 ...

深搜優化剪枝

之前做過不少深搜題,很多tle,所以剪枝很重要,如何 未雨綢繆 避免不必要的搜尋樹分支?例題 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸出乙個整數,即不同的分法。由題意...

深搜剪枝小結

深度優先搜尋,俗稱深搜,即dfs,是乙個常用並且基礎的演算法和思想。但是搜尋演算法的時間複雜度往往很大,是oi不被允許的。所以對於深搜的優化最實用和基礎的乙個方法就是剪枝。三原則 1 正確性 2 準確性 3 高效性 正確性,顧名思義就是不能把通向正確的路徑剪去。準確性,則是盡可能多的剪去不會通向正確...