• 计蒜客:程序设计:划分整数


    https://nanti.jisuanke.com/t/25082

    蒜头君特别喜欢数学。今天,蒜头君突发奇想:如果想要把一个正整数 nnn 分解成不多于 kkk 个正整数相加的形式,那么一共有多少种分解的方式呢?

    蒜头君觉得这个问题实在是太难了,于是他想让你帮帮忙。

    输入格式

    共一行,包含两个整数 n(1≤n≤300)n(1 leq n leq 300)n(1≤n≤300) 和 k(1≤k≤300)k(1 leq k leq 300)k(1≤k≤300),含义如题意所示。

    输出格式

    一个数字,代表所求的方案数。

    样例输入

    5 3

    样例输出

    5

    dp[i][j]表示把 i 分成 j 个数。

    可以当成把n分成k个可以为0的数。

    当i<j的时候,不能分出更多的数,所以dp[i][j] = dp[i][i];

    当i=j的时候,只能分出一个1出来,dp[i][j] = dp[i][j-1] + 1;

    当i>j的时候,至少有一个0的是dp[i][j-1],一个0都没有的是分出 j 出来,把每个都加个1,剩下i-j分成j个数

    dp[i][j]=dp[i][j-1]+dp[i-j][j]。

    #include<stdio.h>
    #define N 320
    long long dp[N][N];
    int main()
    {
    	int n,k,i,j;
    	for(i=1;i<N-10;i++)
    		for(j=1;j<N-10;j++)
    		{
    			if(i<j)
    				dp[i][j]=dp[i][i];
    			else if(i==j)
    				dp[i][j]=dp[i][j-1]+1;
    			else if(i>j)
    				dp[i][j]=dp[i][j-1]+dp[i-j][j];	
    		}
    	while(scanf("%d%d",&n,&k)!=EOF)
    		printf("%lld
    ",dp[n][k]);
    	return 0;
    } 
  • 相关阅读:
    OMNETPP: tictoc
    OMNETPP安装
    Unified SR
    SCM
    DC tunnel
    AIMD
    AQM
    MANAGER POJ1281 C语言
    Pascal Library C语言 UVALive3470
    The 3n + 1 problem C语言 UVA100
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10056599.html
Copyright © 2020-2023  润新知