1. 程式人生 > >遞迴 —— 整數劃分(包括輸出劃分的具體情況)

遞迴 —— 整數劃分(包括輸出劃分的具體情況)

整數劃分

一、只輸出劃分個數

#include<stdio.h>
#include<algorithm>

using namespace std;

//整數n劃分成不大於m的劃分個數 
int divide(int n,int m)
{
	if(n==1 || m==1) return 1;	
	if(n<1 || m<1) return 0;
	if(n < m) return divide(n,n); //m不能大於n 
	if(m == n) return (divide(n,m-1) + 1);	//自身為一種情況 
	if(n > m) return (divide(n,m-1) + divide(n-m,m));	//分為至少包含一個 m 的劃分和 <=m-1 的劃分 
	//必包含m的情況是把n-m之後得到剩餘的數的<=m的劃分情況 ,因為已經確定至少有一個m了 
}

int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		printf("%d\n",divide(n,n));
	} 
	return 0;
} 


二、輸出劃分個數及劃分具體情況

#include<cstdio>
#include<algorithm>

using namespace std;

void print(int a[],int n)
{
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
}

//整數n劃分成不大於m的劃分個數 
int divide(int n,int m,int len,int a[])
{
	
	if(m==1){
		
		if(n==0){
			print(a,len);
			
		}else if(n>0){
			a[len] = 1;
			divide(n-1,m,len+1,a);
			return 1;
		}
	}
	
	else if(n==1){
		
		if(m>1){
			a[len] = 1;
			print(a,len+1);
			return 1;
		}
	}

	else if(n < m) return divide(n,n,len,a); //m不能大於n 
	
	else if(m == n) {
		a[len] = m;
		print(a,len+1);
		return divide(n,m-1,len,a) + 1;	//自身為一種情況 
	}
	
	else if(n > m) {
		a[len] = m; 
		return divide(n-m,m,len+1,a) + divide(n,m-1,len,a) ;//!!這裡必須先遞迴減去m的情況 
	} 
}

int main()
{
	int n;
	int a[100]={0};
	while(~scanf("%d",&n))
	{
		printf("\n%d的劃分個數為:%d\n---------\n",n,divide(n,n,0,a));
	} 
	return 0;
} 


相關推薦

—— 整數劃分包括輸出劃分具體情況

整數劃分 一、只輸出劃分個數 #include<stdio.h> #include<algorithm> using namespace std; //整數n劃分

-棋盤分割演算法基礎 第3周

遞迴-棋盤分割 問題講解: 原始碼: #include <stdio.h> #include <iostream> #include <algorith

pycharm安裝第三方庫包括不可描述的情況

最近研究了下python,idea工具怎可能少,pycharm我是必須要安裝的。要用python,第三方庫不可少,用pycharm安裝還是灰常方便的。但是網路環境經常不可描述,經常連線不上國外資源,這裡

C#中呼叫C++的dll的引數為指標型別的匯出函式包括二級指標的情況

一:首先什麼是IntPtr 先來看看MSDN上說的:用於表示指標或控制代碼的平臺特定型別。這個其實說出了這樣兩個事實,IntPtr 可以用來表示指標或控制代碼、它是一個平臺特定型別。對於它的解釋,這個哥們寫的比較好:It's a class that wraps a

實現順序輸出整數-2017-2018-1 實驗10.2 函式等課堂練習

6-1 遞迴實現順序輸出整數(15 分) 本題要求實現一個函式,對一個整數進行按位順序輸出。 函式介面定義: void printdigits( int n ); 函式printdigits應將n的每一位數字從高位到低

寫一個函式DigitSumn,輸入一個非負整數,返回他組成它的數字之和

寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回他組成它的數字之和 思路分析:遞迴函式的遞推關係:sum%10+DigitSum(sum\10); ​ 出口:sum為個位數; 完整程式: #define _CRT_SECURE_NO_WARNINGS #incl

★★★二叉樹非遍歷 統一的解決思路

轉載:【刷題】二叉樹非遞迴遍歷   stack<Node*> st; void preOrder(Node* root) { Node *cur = root; while (cur || !st.empty()) { while (

【演算法】二叉樹的和非遍歷

原文地址 【寫在前面】   二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採

演算法導論 第四章:式 筆記代換法、樹方法、主方法、主定理的證明

三種解遞迴式的方法:代換法、遞迴樹方法、主方法。 代換法: 用代換法解遞迴式需要兩個步驟: 猜測解的形式; 用數學歸納法找出使解真正有效的常數。 如: T(n) = 2T(n/2) + n,這個是合併排序的執行時間的遞迴表示式。歸併排序法的執行時間是O(nlgn),那麼我

【BZOJ1821】[JSOI2010]部落劃分二分,並查集

【BZOJ1821】[JSOI2010]部落劃分(二分,並查集) 題面 BZOJ 洛谷 題解 二分答案,把距離小於二分值的點全部並起來,\(\mbox{check}\)一下是否有超過\(K\)個集合就好了。 #include<iostream> #include<cstdio>

資料結構與演算法 -- 二叉樹鏈式詳解/遍歷,葉子個數,深度計算

前言 PS:樹型結構是一種重要的非線性資料結構,教科書上一般都是樹與二叉樹,由此可見,樹和二叉樹是有區別和聯絡的,網上有人說二叉樹是樹的一種特殊形式,但經過查資料,樹和二叉樹沒有一個肯定的說法,但唯一可以肯定都是樹型結構。但是按照定義來看二叉樹並不是樹的一種特殊形式(下面解釋)。樹型資料結構的作

二叉樹的遍歷先序、中序和後序

  [前文]   二叉樹的遞迴遍歷包括 先序遍歷、中序遍歷 和 後續遍歷。   如下圖所示的二叉樹:        前序遍歷順序為:ABCDE  (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷其右子樹)   中序遍歷順序為:CBDAE  (先中序遍歷其左子樹,然後訪

二叉樹的非遍歷先序、中序、後序和層序遍歷

[前文] 二叉樹的非遞迴遍歷有 先序遍歷、中序遍歷 、後續遍歷 和 層序遍歷。 非遞迴演算法實現的基本思路:使用堆疊。而層序遍歷的實現:使用佇列。 如下圖所示的二叉樹:      前序遍歷順序為:ABCDE  (先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷

[譯]使用神經網路LSTMs對時序資料進行預測

原文地址:A Guide For Time Series Prediction Using Recurrent Neural Networks (LSTMs) 原文作者:Neelabh Pant 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold-m

[linux]二叉樹的建立及其遍歷C語言實現)

基礎知識 二叉樹的特點: 每一個節點最多有兩棵子樹,所以二叉樹中不存在度大於2的節點,注意,是最多有兩棵,沒有也是可以的 左子樹和右子樹是有順序的,次序不能顛倒,這點可以在哈夫曼編碼中體現, 順序不同編碼方式不同 -即使樹中某個節點中只有一個子樹的花,也要區分它是左子樹還是右子樹

劍指Offer-和迴圈-4

知識點:遞迴和迴圈 題目描述 我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法? 分析:我們先把2x8的覆蓋方法記為f(8).用第一個2x1的小矩形去覆蓋大矩形的最左邊時有兩種選擇:豎著或者橫著放。當豎著放的時

劍指Offer-和迴圈-3

知識點:遞迴和迴圈 變態跳臺階 一隻青蛙一次可以跳上一級臺階,也可以跳上2級。。。。。。它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。 分析: 舉例子找規律; n=1 : 直接返回1; n=2:1-1 2 返回2; n=3:1-1-1 1-2 2-

sql with as 的實現樹形結構

WITH AS短語,也叫做子查詢部分(subquery factoring),定義一個sql 片段,改sql 片段會被整個sql語句用到。其中最實用的功能就是資料的遞迴,遞迴的原理:遞迴包括至少兩個查詢,一個查詢作為遞迴的基點也就是起點,另一個查詢作為遞迴的成員。   一、定義一個

華金礦業之人員定位系統的軌跡繪製實踐版本

根據華金礦業實際的地下基站系統圖紙,考慮來自基站,手卡,時間各個方面,獲得的一種尋找人員軌跡的演算法; 程式碼如下: package cn.com.lf; import java.awt.Graphics; import java.awt.Point; imp