1. 程式人生 > >演算法訓練 數的劃分 (動態規劃)

演算法訓練 數的劃分 (動態規劃)

 演算法訓練 數的劃分   時間限制:1.0s   記憶體限制:256.0MB 問題描述   將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。
  例如:n=7,k=3,下面三種分法被認為是相同的。
  1,1,5; 1,5,1; 5,1,1;
  問有多少種不同的分法。 輸入格式   n,k 輸出格式   一個整數,即不同的分法 樣例輸入 7 3 樣例輸出 4 {四種分法為:1,1,5;1,2,4;1,3,3;2,2,3;} 資料規模和約定   6<n<=200,2<=k<=6

又一個比較巧妙而經典的動態規劃題目

#include<cstdio>
#include<cstring>

int dp[202][10];

int main()
{
	int n,k;
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i&&j<=k;j++)
		{
			if(j==1||i==j)
			{
				dp[i][j]=1;
			}
			else if(j==2)
			{
				dp[i][j]=i/j;
			}
			else
			{
				dp[i][j]+=dp[i-1][j-1]+dp[i-j][j];//包含1就是把一分出來,把i-1分成j-1份,不包含1,給j份每個一個1,然後將剩下的i-j個分成j份 
			}
		}
	}
	printf("%d",dp[n][k]);
	return 0;
}