1 条题解

  • 0
    @ 2023-6-11 12:22:23

    C++ :

    #include<iostream>
    using namespace std;
    int dp[210][16];
    int main()
    {
    	int n,k;
    	cin>>n>>k;
    	for(int i=1;i<=n;i++)
    	dp[i][1]=1;//分成一份的时候只有一种情况 
    	for(int i=1;i<=n;i++)
    	for(int j=2;j<=k;j++)//分成一份的时候跳过,从2开始 
    	{
    		if(i>=j)dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
    		/*k>n情况数肯定是0; 
    		当 i>=j时,缩小规模,分成两类讨论:
    		1.当至少有一个等于一,我们便可以缩小它的规模,
    		变成研究,dp[i-1][j-1]的情况数;
    		2. 当所有的都大于等于2,实际上也就等于每一份里面减去一个一,
    		而份数不变的情况dp[i-j][j] 
    		*/ 
    	}
    	cout<<dp[n][k]<<endl;
    }
    

    Python :

    n,k = map(int,input().split())
    dp = [[0 for i in range(k+1)] for j in range(n+1)]
     
    for i in range(1,n+1):
     
        dp[i][1] = 1
        if k >= 2:
            dp[i][2] = i//2
        if i <= k:
            dp[i][i] = 1
     
    for i in range(4,n+1):
        for j in range(3,k+1):
            if i > j:
                dp[i][j] = dp[i-1][j-1] + dp[i-j][j]
     
    print(dp[n][k])
     
    
    • 1

    信息

    ID
    2727
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者