動態規劃深度搜尋數的劃分

2021-10-08 13:10:43 字數 1616 閱讀 9675

乙個正整數可以劃分為多個正整數的和,比如n=6時: 6;1+5;2+4;3+3;2+2+2;1+1+4;1+2+3;1+1+1+3;1+1+2+2;1+1+1+1+2;1+1+1+1+1+1 共有十一種劃分方法。   給出乙個正整數,問有多少種劃分方法。

乙個正整數n

乙個正整數,表示劃分方案數

n<=100

思路正整數n可以看成n個小球,每乙個小球代表數字一,觀察可知劃分即為將這個n個小球放入k的盒子裡面,且每乙個盒子不能為空,k依次為從1到n,k=1時即為n個1相加。可用動態規劃的思路,每一次分完之後,**(1)**如果k個盒子裡面存在有的盒子小球數量為1,則和將n-1個小球放入k-1個盒子的方法是一樣的,即dp(i)(j) = dp(i-1)(j-1);(dp(i)(j))表示i個小球放入j個盒子的方法(2)如果盒子中不存在只有乙個小球的情況,那麼每乙個盒子至少有乙個小球,假設從每乙個盒子中拿出乙個小球,那麼方法也不會變,所以dp(i)(j)=dp(i-j)(j),得出轉移狀態方程為dp(i)(j)=dp(i-j)(j)+dp(i-1)(j-1)

#include using namespace std;

int dp[201][7];

int main(void)}}

for (i = 1; i <= n; i++)

sum += dp[n][i];//dp[n][i]表示將n個小球放入i(1-n)個盒子裡面,加起來就是最後的總和

cout << sum;

return 0;

}

深度搜尋演算法(用來做此題目會超時超時)列印出所有情況
#include using namespace std;

typedef long long ll;

ll n;

ll sum = 0;

ll num;

int arr[300];

int brr[300];

void dfs(int step,int k)//step表示站在第幾個盒子面前開始處理,k表示盒子的數目,

if (num == n)

return;

}for (i = 1; i <= n; i++)

}return;

}int main(void)

cout << sum;

return 0;

}

深度搜尋剪枝
#include using namespace std;

int arr[1000];

int n;

int ans = 0;

int sum;//sum記錄剩餘數字的和

void dfs(int step, int sum,int k)

return;

}//此方法沒有上面的優化

//if (step-1 == k)

//// return;

//}for (int i = arr[step - 1]; i <= sum / (k - step + 1); i++)//上下界剪枝

}int main(void)

cout << ans;

return 0;

}

Python 數的劃分 動態規劃

題目 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。1,1,5 1,5,1 5,1,1 問有多少種不同的分法。輸入 n,k 6 n 200,2 k 6 輸出 乙個整數,即不同的分法。輸入描述 兩個整數 n,k 6 n 200,2 k...

數的劃分 codevs 黃金題 動態規劃

思路 在本題中我嘗試了一下用遞迴寫的dp,記憶化建立了一張表。dp x y z 中,x代表需要分配的數,y以後代表分數時不能超過y,z代表還剩下幾次分配機會。dp方程為 dp x y z 求和 k從y至1 需要注意 k是從y開始的,需要把x k 0的情況continue掉。需要注意 分配不完 和 分...

搜尋 數的劃分

廢話不多說,直接看題。就像這樣,只是情況有變,把乙個數分成更多的數的和就ok了。既然搜尋,就先考慮一下用深搜還是廣搜,就用深搜把 個人偏愛 那怎麼搜呢?舉個栗子以題目的栗子為栗,7怎麼分?為了按順序,那麼第一位先取1吧,接下來我們還有6要分,還剩下兩個數 第二位也取1吧,那麼我們還有5要分,還剩下1...