1. 程式人生 > >整數劃分,性質一的疑惑,n拆分成k個數

整數劃分,性質一的疑惑,n拆分成k個數

對於整數的拆分中的性質一有不解,在網上搜索的答案中,竟找不到相應的令人滿意的解釋,鬱悶,在群上討論發現瞭如此程式碼,但給出的人又不能做出解釋,只好,先記錄在案下圖,是我自己根據給出的程式碼進行一定的理解分析。

    就發現,,,,,,

    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,在寫部落格的過程中,突然明白了,dp[i-j][j]的作用,(我留出對應j個數的一給你,i-j後的數劃分j個,給你劃分後的數字加一就求得部分答案,)對於dp[i-1][j-1],意思就是,我現在留出一個1,相當於佔了一個,那你就去幫我求出減一後(i-1)的拆成(j-1)個數字給我。

   然後現在還有疑問的是,就是為什麼這樣給就不會出現遺漏和重複了,那應該是數學的問題了吧,哎喲我這笨腦子,嘖嘖嘖,想不通。或許是最後給每個加一的是不會影響dp[i-1][j-1]的取法;有待考究。

#include<iostream>
#include<cstdio>
using namespace std;
long long dp[305][305];
int main() {
    int n, k;
    scanf( "%d%d", &n, &k );
    dp[0][0] = 1;
	for ( int i = 1 ; i <= n ; ++ i ) 
	{
		for ( int j = 1 ; j <= i ; ++ j ) 
		{
			if ( i >= j ) 
			{
				dp[i][j] = dp[i-1][j-1] + dp[i-j][j];
			} 
			else 
			{
				dp[i][j] = dp[i][i];
			}
		}
	}
	long long res = 0;
	printf("%d",dp[n][k]);//求性質一 
    for ( int i = 1 ; i <= k ;  i++ ) 
	{
    	res += dp[n][i];
    }
    printf("%d",res);//求性質二 
    return 0;
}