日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单的划分数

發布時間:2023/12/16 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单的划分数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

劃分數就是將整數 n 分成若干個大于 0 的數的和。例如,n = 4,可以分成 1+1+1+1,1+1+2,1+3,2+2,4,一共 5 種方案,注意 1+1+2,1+2+1,2+1+1被認為是相同的方案。

求整數 80 的劃分數方案。


答案

15796476


思路

還是用dfs做,只是有點慢(要25s)( ̄▽ ̄)”(只適合小數,如果是大數的話就很慢了)。

也可以用遞歸做,將遞歸函數的聲明為 int d(int n, int m);其中n為要劃分的正整數,m是劃分中的最大加數(當m > n時,最大加數為n),分下列幾種情況:

  • 當 n=1,d為1,因為無論m為多少就只有1
  • 當 m=1 時,d=1 ,由上例可知,當 n=4 時,d只有 1+1+1+1 這1種
  • 當 n=m 時,又分為兩種情況:

    • 第一種就是包含m的時候,就只有 m 這一種。
    • 另外一種就是不包含 m ,那么最大數就為 m-1 ,有 d(n,m-1) 種

    因此當 n=m 時,d(n , n)=1+ d(n,n-1)

  • 當n < m 就相當于 d(n,n) 了

  • 當 n > m 時,一種是不含m,為d(n,m-1)種,一種是含有m,有d(n-m,m)種

    因此d(n,m)=d(n-m,m)+d(n,m-1)

    注意理解d(n-m,m),注意這里的前提是劃分包含m,所以將m提出來一個,保證劃分中一定會有m,剩下數字劃分的和為n-m,而這n-m中可能不會出現m,也可能出現m,但由于我們已經提出了一個m,所以此處不用擔心m是否再出現。第一個數為什么是(n-m),原因是提出一個m后,已經保證了劃分中一定出現m,而n-m還沒有進行劃分,這里忽略提出的m,對剩下的整數n-m進行劃分,劃分的最大值仍然是m


代碼

  • dfs代碼
#include <iostream> using namespace std; int total=0; void dfs(int a,int sum){if (sum==80) {total++;return;}if (sum>80) {return;}for (int i=a;i<=80;i++) {dfs(i,sum+i);} } int main(int argc, char *argv[]) {dfs(1,0);printf("%d",total);return 0; }
  • 遞歸代碼
#include <stdio.h> int d(int n, int m){if(n < 1 || m < 1) return 0;if(n == 1 || m == 1) return 1;if(n < m) return d(n, n);if(n == m) return (d(n, m - 1) + 1);if(n > m) return d(n, m - 1)+d((n - m), m); } int main(){printf("%d",d(80,80));return 0; }

總結

以上是生活随笔為你收集整理的简单的划分数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。