1. 程式人生 > >演算法(1)整數劃分問題之遞迴解決

演算法(1)整數劃分問題之遞迴解決

  今日,閱讀《ACM/ICPC 演算法訓練》時,發現一道名為“整數劃分”的題,書上解釋極為模糊,自己研究了一下此題,將其解決,記錄下解題思路,以備以後有用時快速理解;

  一,題意簡述

  將整數表示成一系列正整數之和:n=n1+n2+.....+nk;

  注意:4+2+2和2+4+2是同一種劃分;

  求正整數n的不同劃分個數;

  二,思路

  應用遞迴方法;

  首先,將最大加數nk不大於m的劃分個數記為去q(n,m);

  接著按照一貫思路,找出遞迴關係如下:

  ①當n=1或者m等於1時,顯然劃分數為1;

  ②當n<m時,劃分數為q(n,n)(下面這種情況);

  ③當n=m時,需要找出遞迴關係,即考慮兩種情況:一種是含有m,劃分數為1;一種是不含有m,即其中最大數為m-1,則劃分數為q(n,n-1),找到遞迴關係,YEAH!!。可     知此時總劃分數可表示為1+q(n,n-1);

  ④當n>m時,按照類似的思路找出遞迴關係,即考慮兩種情況:一種是含有m,劃分數為q(n-m,m);一種是不含m,劃分數為q(n,m-1);可知此時總劃分數可表示為

  q(n-m,m)+q(n,m-1);

   (注意理解q(n-m,m),在這裡,減去一個m,使劃分至少含有一個m,但是沒要求一定只含有一個m,可能兩個,可能三個,但是都包含在 對q(n-m,m)的再次劃分        中,q(n,m)和q(n-m,m)的劃分是同一方式,最大都可以是m,但是直到劃分到終點才知道一共有多少個m)

  綜上,得到遞迴關係;

  三,解決程式碼

     public class Main {


public static void main(String[] args) {
Scanner fin=new Scanner(System.in);
int n =fin.nextInt();
int m =fin.nextInt();
int result =q(n,m);
System.out.println(result);
}

//整數劃分函式
public static int q(int n,int m){
if(n<1||m<1){
return 0;
}
else if(n==1||m==1){
return 1;
}
else if(n<m){
return q(n,n);
}
else if(n==m){
return q(n,m-1)+1;
}
else{
return q(n,m-1)+q(n-m,m);
}
}
}

  四,測試結果




測試可知能實現所需功能。

相關推薦

演算法1整數劃分問題解決

  今日,閱讀《ACM/ICPC 演算法訓練》時,發現一道名為“整數劃分”的題,書上解釋極為模糊,自己研究了一下此題,將其解決,記錄下解題思路,以備以後有用時快速理解;   一,題意簡述   將整數表示成一系列正整數之和:n=n1+n2+.....+nk;   注意:4+2

C語言整數劃分問題

對於一個正整數n的劃分,就是把n變成一系列正整數之和的表示式。注意,分劃與順序無關,例如6=5+1跟6=1+5是 同一種分劃。另外,單獨這個整數本身也算一種分劃。 例如:對於正整數n=5,可以劃分為: 1+1+1+1+1 1+1+1+2 1+1+3 1+2+2 2+3 1+4 5 輸入描述 輸入一個正整

資料結構與演算法1連結串列,基於Python解決幾個簡單的面試題

最近頭一直很大,老闆不停地佈置各種任務,根本沒有時間幹自己的事情,真的好想鼓起勇氣和他說,我以後不想幹這個了,我文章也發了您就讓我安安穩穩混到畢業行不行啊……作為我們這些想要跨專業的人來說,其實很大的一個劣勢就是沒有經歷過一個計算機學科完整的培養,所以對計算機專業的一些很基本

全排列及相關擴充套件演算法——基礎的回溯實現全排列演算法

1.全排列的定義和公式: 從n個數中選取m(m<=n)個數按照一定的順序進行排成一個列,叫作從n個元素中取m個元素的一個排列。由排列的定義,顯然不同的順序是一個不同的排列。從n個元素中取m個元素的所有排列的個數,稱為排列數。從n個元素取出n個元素的一個排列,稱為一個全

排序演算法——歸併排序與

基本思想 分析歸併排序之前,我們先來了解一下分治演算法。 分治演算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。 分治演算法的一般步驟: (1)分解,將要解決的問題劃分成若干規模較小

【JAVA面試】JAVA常考點資料結構與演算法1

                            JAVA常考點之資料結構與演算法(1) JAVA常考點之資料結構與演算法 目錄

機器學習決策樹演算法1

上一集中,我們講解了K近鄰演算法,那是一個十分入門的演算法,並沒有顯式的訓練方法。這次,我們要做一個真正的機器學習演算法,決策樹演算法。當然,它也是一個多元分類器。相比較K近鄰演算法對於數值型的資料處理較為舒服,因為畢竟是算距離,所以你就算是跑到天涯海角,也能算出來。但是決

我的軟考——資料結構與演算法1線性

         資料結構與演算法是程式設計的兩大基礎,大型的IT企業面試時也會出資料結構和演算法的題目,它可以說明你是否有良好的邏輯思維,如果你具備良好的邏輯思維,即使技術存在某些缺陷,面試公司也會認

1學習筆記mysql基本操作

info 文件 star 操作 圖片 muti mysq 推薦 com 本系列學習筆記主要講如下幾個方面; 1.mysql啟動      如圖,有多重啟動方式   (1.1)mysql.server start  (1.2)/etc/init.d/mysqld sta

二分答案經典例題1 整數域的二分答案

什麼時候我們要二分答案? 答:當答案具有單調性時(這不是廢話嗎emmm) 來看一道最經典的例題: https://www.luogu.org/problemnew/show/P1182 Problem1:對於給定的一個長度為的正整數數列,現要將其分成段,並要求每段連續,且每段和的

聚類演算法1

一聚類演算法簡介 1.聚類和分類的區別 聚類 - 利用演算法將相似或者相近的樣本聚成一簇,這些樣本都是無標籤的,是一種無監督學習演算法。 分類 - 首先需要從有標籤樣本學習出打標籤邏輯,再利用學習出的邏輯對無標籤樣本進行分類,是一種有監督學習演算法。 2.聚類的使用 聚類演

KMP 演算法1:如何理解 KMP

http://www.61mon.com/index.php/archives/183/ 系列文章目錄 KMP 演算法(1):如何理解 KMPKMP 演算法(2):其細微之處 一:背景TOC 給定一個主字串(以 S 代替)和模式串(以 P 代替),要

經典排序演算法1——氣泡排序演算法詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

效能學習隨筆1--負載均衡f5負載均衡

負載均衡設計涉及軟體負載和硬體負載,下文轉自CSDN中一篇文章涉及f5硬負載知識 ----轉載:https://blog.csdn.net/tvk872/article/details/80634898 網路負載均衡(load balance),就是將負載(工作任務)進行平衡、分攤到多個操作單元上進行執行

貪心演算法1—— 活動安排問題 以及 電視節目問題 的區別

一、活動安排問題 #include <iostream> #include <algorithm> using namespace std; /* 題目型別:活動安排問題 特點:所有活動都需要進行,要求輸出所需的會場數 演算法:貪心演算法 注意

理解OpenShift1:網路 Router 和 Route Neutron 理解 (7): Neutron 是如何實現負載均衡器虛擬化的

 理解OpenShift(1):網路之Router 和 Route   1. OpenShift 為什麼需要 Router 和 Route? 顧名思義,Router 是路由器,Route 是路由器中配置的路由。OpenShift 中的這兩個概念是為了解決從叢集外部(就是從除了叢集節點

python資料結構與演算法1

資料結構與演算法(Python) Why?我們舉⼀個可能不太恰當的例⼦:如果將開發程式的過程⽐喻為作戰,我們碼農便是指揮作戰的將軍,⽽我們 所寫的程式碼便是⼠兵和武器。那麼資料結構和演算法是什麼?答⽈:兵法!我們可以不看兵法在戰場上⾁搏,如此,可能會勝利,可能會失敗。即使勝 利,可能也會付出巨⼤的代價。我們寫

簡單的演算法1--從尾到頭列印連結串列

目錄 1、java實現 1.1、遞迴 1.1.1、測試(完整原始碼) 1.2、利用棧來實現 1.2.1、測試 2、C語言 2.1、先將連結串列反轉,再從頭輸出(改變連結串列的結構) 2.2、利用棧的“先進後出”特性   1、java實現 連結

資料結構1順序查詢C語言實現

#include <stdio.h> #include <stdlib.h> /** 順序查詢: 無序; */ void mainSS() { int num[]={0,1,2,38,99,56,67,87,55,26}; int f

資料結構與演算法-線性表單鏈表順序儲存和鏈式儲存

前言:前面已經介紹過資料結構和演算法的基本概念,下面就開始總結一下資料結構中邏輯結構下的分支——線性結構線性表 一、簡介 1、線性表定義   線性表(List):由零個或多個數據元素組成的有限序列;   這裡有需要注意的幾個關鍵地方:     1.首先他是一個序列,也就是說元素之間是有個先來後到的。