1. 程式人生 > >遞迴較難題——分蘋果問題

遞迴較難題——分蘋果問題

第四屆程式設計大賽 蘋果

Time Limit:1000MS  Memory Limit:65536K
Total Submit:90 Accepted:48

Description

把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。

Input

第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N<=10。

Output

對輸入的每組資料M和N,用一行輸出相應的K。

Sample Input

1
7 3

Sample Output

8

分析轉自:http://uzone.univs.cn/blog_2984978_mgf8x9eow0qnb2wreow1.html

分析:放法要分盤子全放滿了和沒放滿的情況。 由於當(1):蘋果數少於盤子數時,此時把盤子減少一個,對結果沒影響。(為什麼?試想如果10個蘋果放1000個盤子,是不是很多盤子沒用呢?嘿嘿)這樣此時 fun(m,n)=fun(m,n-1);    (2):蘋果數少於盤子數,此時仍可以分成兩種情況:放滿和沒有放滿。 沒放滿:fun(m,n)轉化成fun(m,n-1)(因為你有盤子沒用) 放滿:放滿即為每個盤子都有蘋果,那麼我把每個盤子的蘋果拿一個出來結果仍然會是一樣。此時的fun(m,n)轉化成fun(m-n,m);(既然每個盤子必須有個蘋果,那麼這些蘋果的存在與否可以當作不影響結果,比如拿5個蘋果放2個盤子,又要滿足每個盤子必須有個蘋果的話那肯定有兩個蘋果不能動,必須放在盤子下,然後他們就與盤子融為一體,我們就當作看不見他們了。。。。。嘿嘿); 好了,函式進來盤子與蘋果的數量關係每次都滿足上面的兩種情況,每次又歸化成更簡單的繼續下去,那麼很顯然就想到了遞迴。 程式碼如下: #include<stdio.h> int fun(int m,int n) {          if(m<=1||n==1)                    return 1;//為m可能為和n相等,此時如果要滿足每個盤子都有的話只有一種放法。只有一個盤子也只有一種          if(n==0)                    return 0;          if(n>m)//至少有一個盤子為空                    return fun(m,n-1);           else//至少一個盤子為空 + 所有盤子都不為空              return fun(m,n-1)+fun(m-n,n); }  int main() {          printf("%d\n",fun(7,3)); }

My  code:

#include<stdio.h>
int fun(int m,int n)
{
         if(m<=1||n==1)
                   return 1;//為m可能為和n相等,此時如果要滿足每個盤子都有的話只有一種放法。只有一個盤子也只有一種
         if(n==0)
                   return 0;
         if(n>m)//至少有一個盤子為空
                   return fun(m,n-1); 
         else//至少一個盤子為空 + 所有盤子都不為空
             return fun(m,n-1)+fun(m-n,n);
}
 int main()
{
	 int m,t,n;
	 while(scanf("%d",&t)==1)
	 {
	 	while(t--)
	 	{
	 		scanf("%d%d",&m,&n);
	 		printf("%d\n",fun(m,n));
		 }
	 }
    return 0;
}


相關推薦

難題——蘋果問題

第四屆程式設計大賽 蘋果 Time Limit:1000MS  Memory Limit:65536K Total Submit:90 Accepted:48 Description 把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K

java 設定層級 級數

//多級角色遞迴查詢方法 public List<ProductCategory> iterateRoles(List<ProductCategory> menuVoList,String pid,Long level){

小白菜oj 1038 [視訊]8(解數)

題目:分解數 思路: 直接搜尋,順序要注意。 程式碼: #include<bits/stdc++.h> using namespace std; int n; vector<int&

python繪製簡單形樹

對於樹形結構,首先要明白繪製的過程: 1 繪製右數 2 返回節點 3 繪製左樹 4 返回節點 程式碼: """ 作者:sust_ly 功能:繪製分形樹 版本:2.0 日期:2018/3/2 """ import turtle def draw_shu(le

簡單的——蘋果到盤子

把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 輸入 每個用例包含二個整數M和N。0<=m<=10,1<=n<=10。 樣例輸入 7 3 樣例輸出 8

演算法——蘋果問題和算24問題(演算法)

#include <iostream>using namespace std;/*分為n>m和n<m兩種情況。當n>m時,一定有盤子為空,此時f(m,n)=f(m,m)當n<=m時,分為有盤子為空時(至少有一個盤子為空):f(m,n-1),

蘋果(列舉加

/* 描述:把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 輸入:第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=

POJ 1644 蘋果歸解法)

分析 sample output name sca out -m 遞歸解法 iostream 把M個同樣的蘋果放在N個同樣的盤子裏,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 Input 第一行是測試數據的數目t(0 &

【qduoj - 夏季學期創新題】矩形剖,dp)

題幹: 描述   對一個給定的矩形,將其劃分成儘可能少的正方形,輸出正方形的最少個數。例如,如下圖所示的情況,則輸入為3和4,輸出為4。 輸入   輸入兩個整數中間用空格分開。 輸出   輸出最少分割成的正方形的個數。 輸入樣

【POJ - 1664】放蘋果經典題 或 dp 或 母函式)

題幹: 把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 Input 第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N&

Java:利用求解桔子問題

問題描述:        日本著名數學遊戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完 後父親說:“老大將分給你的桔子的1/8給老二;老二拿到後連同原先的桔子分1/7給老三;老三拿到後連同原先的桔子分1/6給老四;老四拿到後連同

水手椰子——迭代法、解題

題目內容: n(1< n <=5)個水手在島上發現一堆椰子,先由第1個水手把椰子分為等量的n堆,還剩下1個給了猴子,自己藏起1堆。然後,第2個水手把剩下的n-1堆混合後重新分為等量的n堆,還剩下1個給了猴子,自己藏起1堆。以後第3、4個水手依次按此方法處理。最後,第n個水手把剩下的椰子分為等量的

[Bash]函式與形-

  ____________________________________________________________________________________________________ _______________________________________

poj1664放蘋果

vj題目連結:https://cn.vjudge.net/problem/POJ-1664 題目描述 把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 Input 第一行是測試資料的數目t(0 &l

漢諾塔的非實現(25

藉助堆疊以非遞迴(迴圈)方式求解漢諾塔的問題(n, a, b, c),即將N個盤子從起始柱(標記為“a”)通過藉助柱(標記為“b”)移動到目標柱(標記為“c”),並保證每個移動符合漢諾塔問題的要求。 輸入格式: 輸入為一個正整數N,即起始柱上的盤數。 輸出格式: 每個操作(移動)佔一

poj 1664放蘋果(轉載,不詳細,勿點)()

題目和別人的解析傳送門 我的程式碼 #include<bits/stdc++.h> using namespace std; int f(int m,int n) { if(n==0) return 0; if(m==0||m==1) return 1;

4-19 計算P函式 (10)

本題要求實現下列函式P(n,x)P(n,x)P(n,x)的計算,其函式定義如下: 函式介面定義: double P( int n, double x ); 其中n是使用者傳入的非負整數,x是雙精度浮點數。函式P返回P(n,x)P(n,x)P(n,x)函式的相應值。題目

4-18 求Fabonacci數列 (10)

本題要求實現求Fabonacci數列項的函式。Fabonacci數列的定義如下: f(n)=f(n−2)+f(n−1)f(n)=f(n-2)+f(n-1)f(n)=f(n−2)+f(n−1) (n≥2n\ge 2n≥2),其中f(0)=0f(0)=0f(0)=0,f(1)=1f

4-17 計算Ackermenn函式 (10)

本題要求實現Ackermenn函式的計算,其函式定義如下: 函式介面定義: int Ack( int m, int n ); 其中m和n是使用者傳入的非負整數。函式Ack返回Ackermenn函式的相應值。題目保證輸入輸出都在長整型 範圍內。 裁判測試程式

4-16 求簡單交錯冪級數的部分和 (10)

本題要求實現一個函式,計算下列簡單交錯冪級數的部分和: f(x,n)=x−x2+x3−x4+⋯+(−1)n−1xn f(x, n) = x - x^2 + x^3 - x^4 + \cdots + (-1)^{n-1}x^nf(x,n)=x−x​2​​+x​3​​−x​4​​+