这是我的第一道 划分型dp
题目的意思把一个数划分成k个和
用f(I,j)表示将整数I分成j分的分法,可以划分为两类:
第一类 :j分中不包含1的分法,为保证每份都>=2,可以先那出j个1分到每一份,然后再把剩下的I-j分成j份即可,分法有:f(I-j,j).
第二类 : j份中至少有一份为1的分法,可以先那出一个1作为单独的1份,剩下的I-1再分成j-1份即可,分法有:f(I-1,j-1).
所以:f(I,j)= f(I-j,j)+ f(I-1,j-1)
#include<iostream>
using namespace std;
long long f[210][7];
int n,k,i,j;
int main()
{
cin>>n>>k;
f[0][0]=1;
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
if(i>=j)f[i][j]=f[i-j][j]+f[i-1][j-1];
cout<<f[n][k];
return 0;
}