1. 程式人生 > >poj 1664 整數劃分

poj 1664 整數劃分

http image ace stream 圖片 分享 count 技術分享 nbsp

技術分享圖片

根據題意,將n個蘋果放入m個盤子中,盤子樣式相同,求所有方法。

這是一個典型的整數劃分問題

1.n == 1 只有一個蘋果,由於盤子樣式相同,那麽放在哪個盤子中都是一種放法,fun(n,m) = 1

2.m == 1 只有一個盤子,將所有蘋果放到那個盤子中  fun(n,m) = 1

3.n < m 盤子數比蘋果數多,最多把n個蘋果放到n個盤子中  fun(n,m) = fun(n,n)

4.n == m 盤子數等於蘋果數,第一種情況每個盤子放一個蘋果,第二種情況在至少一個盤子不放蘋果的情況下,fun(n,m) = fun(n,m-1) 所以fun(n,m) = 1 + fun(n,m-1)

5.n <= m 第一種情況至少一個盤子不放蘋果,fun(n,m) = fun(n,m-1) 第二種情況所有盤子都有蘋果,將每個盤子蘋果拿出一個,再將n-m個蘋果放到m個盤子中 fun(n,m) = fun(n-m,m) 所以fun(n,m) = fun(n-m,m) + fun(n,m-1)

#include<iostream>
using namespace std;

int fun(int a,int b)
{
    if(a==1||b==1)
        return 1;
    if(a < b)
        return fun(a,a);
    
if(a == b) return 1 + fun(a,b-1); return fun(a,b-1) + fun(a-b,b); } int main() { int count,a,b; cin >> count; while(count--) { cin>>a>>b; cout<<fun(a,b)<<endl; } return 0; }

poj 1664 整數劃分