藍橋杯 演算法提高 數的劃分----------------------C語言——菜鳥級
阿新 • • 發佈:2019-02-12
/*
問題描述
一個正整數可以劃分為多個正整數的和,比如n=3時:
3;1+2;1+1+1;
共有三種劃分方法。
給出一個正整數,問有多少種劃分方法。
輸入格式
一個正整數n
輸出格式
一個正整數,表示劃分方案數
樣例輸入
3
樣例輸出
3
資料規模和約定
n<=100
思路: 相當與 有m個球 放如 k 個箱子
*/
#include<stdio.h>
long long int vis[101][101]={0};//用於 優化 記錄 剪枝
long long int f(int m,int k)
{ if(vis[m ][k]!=0)return vis[m][k];//當前 要把 m 拆分 k 部分 有多少種情況
if(k==1||k==m)return 1;//當k==1 剩下的就是最後一個數 k==m 此情況 直接全部放 1;
if(m<k)return 0;
return vis[m][k]=f(m-1,k-1)+f(m-k,k);
}
int main()
{
int n,i;long long int sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
sum+=f(n,i); //把 m 拆分成 i位;
printf ("%lld",sum);
return 0;
}