整數劃分問題的公升級版,記錄的同時分享一下演算法
我對著矽谷發誓,本文原創!
任何乙個大於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
output5=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 如下...