数の除算
タイトルの説明
整数をコンポーネントに分割し、各部分を空にすることはできません。2つのソリューションは同じではありません(順序に関係なく)。
例:次の3つの分類は同じと見なされます。
1,1,5; 1,5,1; 1,1,5。
いくつの異なる部門があるか尋ねてください。
入力形式
2つの整数、および。
出力フォーマット
異なる分割番号を出力します。
サンプル
入力サンプル
7~3
出力サンプル
4つの
サンプル説明
つの分類方法である:1,1,5; 1,2,4; 1,3,3; 2,2,3-。
データ範囲とヒントデータの
100%の場合、6≤n≤200、2≤k≤6。
問題解決のアイデア
F(i、j)はとする
初期値JにIで除算方式の数:
ときJ = 1及びiはJ = F(I、J)= 1
:再帰
2つのケース
1. j株の少なくとも1つが1で、プランの数がf(i-1、j-1)
です。2。j株に1がないので、ijをj株に分割することを検討してから、それぞれに移動します。 jはコピー+1を共有し、プランの数はf(ij、j)です。
故有递推式:
f ( i , j ) = f ( i − 1 , j − 1 ) + f ( i − j , j ) f(i,j)=f(i-1,j-1)+f(i-j,j) f (i 、j )=f (i−1 、j−1 )+f (i−j 、j )
ACコード
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,f[205][10];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=min(i,k);j++)
if(j==1||i==j)f[i][j]=1;//初值
else f[i][j]=f[i-j][j]+f[i-1][j-1];//递归
printf("%d",f[n][k]);
return 0;
}