C++ 整數拆分辦法詳解。本站提示廣大學習愛好者:(C++ 整數拆分辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 整數拆分辦法詳解正文
1、成績配景
整數拆分,指把一個整數分化成若干個整數的和
如 3=2+1=1+1+1 共2種拆分
我們以為2+1與1+2為統一種拆分
2、界說
在整數n的拆分中,最年夜的拆分數為m,我們記它的計劃數為 f(n,m)
即 n=x1+x2+······+xk-1+xk ,隨意率性 x≤m
在此我們采取遞歸遞推法
3、遞推關系
1、n=1或m=1時
拆分計劃僅為 n=1 或 n=1+1+1+······
f(n,m)=1
2、n=m時
S1拔取m時,f(n,m)=1,即n=m
S2不拔取m時,f(n,m)=f(n,m-1)=f(n,n-1),此時評論辯論最年夜拆分數為m-1時的情形
可歸結 f(n,m)=f(n,n-1)+1
3、n<m時
由於不克不及拔取m,所以可將m看做n,停止n=m時的計劃,f(n,m)=f(n,n)
4、n>m時
S1拔取m時,f(n,m)=f(n-m,m),被拆分數因拔取了m則變成n-m,且n-m中能夠還能拔取最年夜為m的數
S2不拔取m時,f(n,m)=f(n,m-1),此時評論辯論最年夜拆分數為m-1時的情形
可歸結 f(n,m)=f(n,m-1)+f(n-m,m)
總遞推式為
代碼以下
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int f(int n,int m) { if ((n!=1)&&(m!=1)) { if (n>m) return f(n-m,m)+f(n,m-1); else return 1+f(n,n-1); } else return 1; } void work() { int n,m; cin>>n>>m; cout<<f(n,m); } int main() { freopen("cut.in","r",stdin); freopen("cut.out","w",stdout); work(); return 0; }
以上所述是小編給年夜家引見的C++ 整數拆分辦法詳解,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!