演算法(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; /* 題目型別:活動安排問題 特點:所有活動都需要進行,要求輸出所需的會場數 演算法:貪心演算法 注意
理解OpenShift(1):網路之 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.首先他是一個序列,也就是說元素之間是有個先來後到的。