這個問題,看似是乙個簡單的排列組合問題,但是加上不同的限制條件,會演變成不同的問題,感覺很奇妙,就總結一下列舉下來
問題一
問題描述:把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問有多少種不同的分法?(注:5,1,1和1,1,5是同一種分法)
解題分析:
設f(m,n)為m個蘋果,n個盤子的放法數目,則先對n作討論,
含有0的方案數,即有至少乙個盤子空著,即相當於 f(m,n)=f(m,n-1);
不含有0的方案數,即所有的盤子都有蘋果,相當於可以從每個盤子中拿掉乙個蘋果,不影響不同放法的數目,即 f(m,n)=f(m-n,n).而總的放蘋果的放法數目等於兩者的和,即 f(m,n)=f(m,n-1)+f(m-n,n)
遞迴出口條件說明:
用遞迴解法
int fun(int m, int n)
用動態規劃解法:
int mat=new int[m+1][n+1];
for(int i = 0; i <=m; i++)
for(int i = 0; i <=n; i++)
for (int i = 1; i <=m; i++)
return sum;
}
問題三
m---->相同, n---->相同, 不能為空。將m個蘋果放進n個盤子中,有多少種方法。同時注意例如1、2和2、1這兩種方案是一種方案。
思路,先把每個盤子都放乙個蘋果,這樣問題就轉化為:m-n個蘋果放進n個盤子裡,盤子允許空,即問題1
POJ 1664 放蘋果 DFS 遞迴
因為一瞬間腦子不太清楚,有個地方敲錯了,導致了這道水題花了我一些時間,其實很簡單.首先想到的是dfs,因為一直在做這個嘛.dfs 比較長,好不容易遇到一道容易題,我還剪了剪枝。這麼水的題,有點多此一舉啊 includeint m,n int total,num void dfs int remain...
poj1664放蘋果 遞迴
放蘋果time limit 1000ms memory limit 10000k total submissions 23149 accepted 14694 description 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1...
poj 1664 放蘋果(遞迴)
題目 將m個蘋果放入n個籃子中,允許有籃子空著,請問一 共有幾種放法?注意 不能出現重複的放法 輸入 第一行輸入需要測試的次數t,0 t 20。第二行輸入蘋果的數量m和籃子的數量n,1 m,n 10。輸出 輸出一共有幾種放法。試例 input 1 7 3 output 8分析 首先,蘋果和籃子的關係...