import sys

def combine(n,k)->int:
    if k>n or k<0:
        return 0
    if k==0 or k==n:
        return 1
    dp=[[0]*(k+1) for _ in range(n+1)]  #创建dp数组,防止越界
    dp[0][0]=0
    for i in range(n+1):  #遍历每一行
        dp[i][0]=1   #每一行第一个元素为1
        upper=min(i,k)  #确定该行可以遍历到什么位置,不能超过k和当前i
        for j in range(1,upper+1):
            dp[i][j]=dp[i-1][j-1]+dp[i-1][j]  #递推式
    return dp[n][k]

def main():
    try:
        print("请输入:")
        line=sys.stdin.readline().strip() #读取一行,去掉前后空格,返回字符串
        if not line:
            return
        nums=list(map(int,line.split()))  #将字符串以空格分开,转成int,返回列表
        res=combine(nums[0],nums[1])
        print(res)
        return
    except ValueError:
        return

if __name__=="__main__":
    main()

描述:

       组合数: 从n个物品里面选k个,共有多少种方法? 可以选0个至k个,即C(n,k)

        杨辉三角:每行第一个数和最后一个数字都为1,dp数组,dp[i][j],表示在i个里面选j个有dp[i][j]种方法,递推式dp[i][j]=dp[i-1][j-1]+dp[i-1][j],即当前的数等于其左上角的数加上右上角的数。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐