POJ 1664 放蘋果

打算在期末考試之前把數算的相關題目刷一刷,期末如果像期中這麼慘就沒得玩了,發現線性表裏最水的一道放蘋果,就順手寫掉好了,這樣想想,放蘋果還是我學的第一道遞歸的題目,當時真是理解了好久都沒弄明白,後來程序設計實習的簡單整數劃分用DP也是累的夠嗆,重看這道題覺得當時自己真的好蠢= = 就從最簡單的開始吧,每天寫一點,避免期末的時候手忙腳亂

程序只需要一個遞歸就可以完成了,notation(m,n)是m個蘋果放在n個盤子裏面並且把這n個盤子完全用掉的方案數量,總的遞歸返回的是放蘋果的方案總數

1、如果盤子的數量多於蘋果的數量,那麼這種情況的方案總數和盤子的數量等於蘋果的數量相同;

2、如果蘋果的數量多於盤子的數量,那麼方案總數就等於把蘋果數量不變,盤子總數減一的方案數量加上蘋果數減去盤子數,盤子數不變的方案數量

3、最後確定邊界條件,蘋果數爲1的時候方案只有一種,盤子數爲0的情況也記爲一種方案(等價於盤子數和蘋果數相同的情況)。

#include<cstdio>
#include<iostream>
using namespace std;

int notation(int m,int n){
    if(m<=0)
        return 1;
    if(n<=1)
        return 1;
    if(m<n)
        return notation(m,m);
    if(m>=n)
        return notation(m-n,n) + notation(m,n-1);
}

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int m,n;
        scanf("%d%d",&m,&n);
        printf("%d\n",notation(m,n));
    }
    //system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章