傳送門
我們考慮將第n只小豬塞進m個房子裡(記做f[n][m]):
顯然答案分為兩部分:
第一部分:
將這只豬扔到乙個新房間,共有方案數:f[n-1][m-1]
第二部分:
將這只豬扔進之前的房間,乘法原理知共有方案數:m*f[n-1][m]
綜上:有狀態轉移方程:f[n][m]=f[n-1][m-1]+m*f[n-1][m]
特別的:f[1][1]=1
這種數就是將n個不同的元素拆分成m個集合的方案數,又稱:第二類斯特林數。
同時由於資料範圍較大,考慮使用高精加和高精乘。
那麼我們令f[i][j][0],表示f[i][j]的位數,之後為f[i][j]每一位。
#include#include#include
#include
#include
using
namespace
std;
int f[60][60][60
];int _ans[60
],_size;
intn,m;
void _change(int x,int
y) _size=f[x-1][y][0
];
if(_x!=0
) _ans[++_size]=_x;
f[x][y][
0]=1
; _x=0
;
while(f[x][y][0]<=f[x-1][y-1][0]||f[x][y][0]<=_size)
f[x][y][f[x][y][
0]]=_x;
if(f[x][y][f[x][y][0]]==0&&f[x][y][0]!=1
) f[x][y][
0]--;
}int
main()
f[1][1][0]=1
; f[
1][1][1]=1
;
for(int i=2;i<=n;i++)
for(int j=1;j<=min(i,m);j++)
_change(i,j);
if(f[n][m][0]==1&&f[n][m][1]==0
)
for(int i=f[n][m][0];i>=1;i--)
printf("%d
",f[n][m][i]);
}
初識C 案例三隻小豬豬稱體重
三隻小豬稱體重是我學習c 遇到的第乙個困擾案例 關鍵就在於初學不能很好的運用if的巢狀,經常搞的頭昏 特別是在三隻小豬同等體重的情況下 後來我在看了 歲月蹉跎的一杯酒 這個大佬發的三隻小豬的文章後自己又想了想,覺得邏輯運算子是真的好用 剛開始建立三隻小豬的變數以及體重輸入儲存都不是問題 includ...
第三隻貓進門
在把小灰接回來之前,就連救助人都曾勸告過我,說乙個人帶兩隻貓就差不多了,帶三隻會很辛苦。我說不怕,不就是多吃點糧食多鏟點貓屎嗎?事實證明,流浪貓的寄養工作並不都那麼好做。小灰是花咪10月14日左右發現的,當時它在北窪路一帶,和另外幾隻流浪貓生活在一起。從看到小灰的第一眼起,我就為它牽腸掛肚,這麼漂亮...
理財必備的三隻基金
提起這幾年理財市場的變化,不能不說到開放式 從2001年9月首只開放式 華安創新問世以來,經過幾年的發展,市場無論是從數量 規模還是品種,都發生了翻天覆地的變化,特別是 品種由過去單一的 發展成為目前的 債券 混合 保本 貨幣 百花齊放。數量和品種不斷增多對投資者來說肯定是好事,但很多任務薪族平常忙...