poj 1664 整數劃分
阿新 • • 發佈:2018-02-27
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 整數劃分