整数划分问题的递归算法-c语言,简单的整数划分问题(递归)
描述
將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。
輸入
標準的輸入包含若干組測試數據。每組測試數據是一個整數N(0 < N <= 50)。
輸出
對于每組測試數據,輸出N的劃分數。
樣例輸入
5
樣例輸出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
可能是因為本人比較笨的原因吧,這道題提交了九遍才對。
一開始覺得像斐波那契的變式,但后來才發現不行,才老老實實寫遞歸,這個問題我們需要把我們遞歸的數記錄下來,因為題目說了(n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1)
所以我們用a數組來記錄,每次判斷這個數行不行時,就與前面的數進行判斷,比大小,本人給這個遞歸函數取了一個沒有技術含量的名字叫solve(int n),我們用循環從1到n(兩端取到,不必從0~n,因為0可以一直遞歸下去,而且判斷n時,就相當于在判斷0)。
OK,那么我們這個邊界值就是n==0,就cnt++;
最后輸出。
提醒一下,數據最大為50,會超時,所以我們保險起見,先把40~50的結果打出來,直接復制給a,然后輸出。
我是把1~40的先算出來,40-50的直接復制。然后再輸入n,直接輸出。
好了,看代碼。
#include
using namespace std;
long long int n,a[1000],cnt,b[70];
void solve(int m,int death)
{
bool flag=1;
if(m==0)
{
cnt++;
}
else
{
for(int i=1;i<=m;i++)
{
flag=1;
++death;
for(int j=1;j
if(a[j]>i)
{
flag=0;
break;
}
if(flag)
{
a[death]=i;
solve(m-i,death);
}
--death;
}
}
}
int main()
{
for(int i=1;i<=39;i++)
{
solve(i,0);
memset(a,0,sizeof(a));
b[i]=cnt;
cnt=0;
}
b[40]=37338;
b[41]=44583;
b[42]=53174;
b[43]=63261;
b[44]=75175;
b[45]=89134;
b[46]=105558;
b[47]=124754;
b[48]=147273;
b[49]=173525;
b[50]=204226;
while(cin>>n)
{
cout<
}
}
標簽:cnt,death,正整數,遞歸,int,flag,50,整數,劃分
來源: https://blog.csdn.net/cxoi9010/article/details/116381931
總結
以上是生活随笔為你收集整理的整数划分问题的递归算法-c语言,简单的整数划分问题(递归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言通讯录运行结果,自己改编的通讯录,
- 下一篇: c语言保存文件格式如何改回来,急求如何将