C 整數劃分問題 (帶算式

2021-08-25 17:27:00 字數 1460 閱讀 4664

整數劃分問題的公升級版,記錄的同時分享一下演算法

我對著矽谷發誓,本文原創!

任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和,當n等於5時有6種拆分方法:

5=1+1+1+1+1

5=1+1+1+2

5=1+1+3

5=1+2+2

5=1+4

5=2+3

ps.本題不包含n=n這種情況

input
一行包含乙個正整數n(1output先將拆分方案輸出,然後再輸出拆分的方案數。
test

input

5
output
5=1+1+1+1+1

5=1+1+1+2

5=1+1+3

5=1+2+2

5=1+4

5=2+3

total=6

(遞迴演算法,n<10不會超時)

深搜函式:void dfs(int min,int sum,string head)

引數解析
min:算式中最小的乙個數為幾

(比如min=2時,1+2就會被遮蔽,避免出現2+1+2和1+2+2同時出現之類的重複現象)

sum:算式相加為幾,簡單不解釋

head:又乙個重要的引數,由於我們是直接在函式中輸出的,所以前面一部分的算式就要存在head裡

過程解析
深搜函式:

1:如果sum不等於n,輸出head,再輸出sum,最後種類變數++

2:for迴圈重複i=min~sum/2,如果min>sum/2就直接退出函式,

否則迴圈遞迴呼叫dfs(i(不用和min比就知道不會比他小了吧),sum-i,

head(別忘了這個)連線上i連線上'+')

吃瓜群眾:為什麼是sum/2,而不是sum?

回答:你傳乙個min=2,sum=1......大寫的尷尬

main主函式:

1:獲取n

2:呼叫dfs(1,n,"n=")

3:輸出種類變數

4:return 0

string和char我現在統一成了char (cstring=使用char ),各位還需細分

#include

#include//using strcat

#include//用sprintf來對int和string互換

using

namespace

std;

int t=0,n;

void dfs(int,int,string);

int main()

void dfs(int min,int sum,string h)

}//除本段開始的那個毛病之外,沒毛病了

整數劃分問題 c語言

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...

整數劃分問題

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...

整數劃分問題

給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...