杨辉三角

据说是腾讯的一个笔试题

Deadly 提交于 2019-11-28 02:26:09
小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。 输入描述: 每个输入包含一个测试用例。 每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。 接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。 某某用python写的程序是这样 k = int(input().strip()) lx, x, ly, y = list(map(int, input().strip().split(" "))) dp = [1] + [0] * k # 第一位初始化为1 for i in range(x): for j in range(k, lx-1, -1): dp[j] += dp[j-lx] for i in range(y): for j in range(k, ly-1, -ly): # 第二次步长为ly dp[j] += dp[j-ly] print(dp[k]%1000000007) 以下为分析 这个程序猿应该是把这个问题想象成一个杨辉三角的问题,杨辉三角有个例子是寻找A到B的线路(传不了图)

在屏幕上打印杨辉三角。

为君一笑 提交于 2019-11-28 00:49:56
/* 1 1 1 1 2 1 1 3 3 1 */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #define row 10 //定义二维数组的行 #define col 10 //定义二维数组的列 //定义一个函数判断杨辉三角的层数是否超出范围 int Determine(){ int m; while (1){ //输入要打印的杨辉三角层数 printf("请输入杨辉三角的层数m(1 <= m <= 10):\n"); scanf("%d", &m); //判定杨辉三角的层数是否合格 if (1 <= m && m <= 10){ //满足条件跳出循环 break; } else{ //不满足条件继续进行输入 printf("层数不符合要求,请重新输入:"); } } //返回经过判定合格的层数 return m; } //定义杨辉三角函数 void pascal_triangle(int n){ int i,j; //定义二维数组并初始化为0,用来存储杨辉三角 int F[row][col] = { 0 }; //双层循环实现杨辉三角赋值 for (i = 0; i < n; ++i){ for (j = 0; j <= i; ++j){ // 当j=0时,F[i][0] == 1

用java输出杨辉三角

*爱你&永不变心* 提交于 2019-11-27 16:56:59
杨辉三角:它的两个边都是1,内部其它都是肩上两个数的和 第一种: package aaa; public class YangHui { public static void main(String[] args) { /** * 6行6列的杨辉三角 */ int row = 6;//行数 int[][] yanghui = new int[row][row];//6行6列数组 for (int i = 0; i < row; i++){//行 for(int j = 0;j<= i;j++){//列 if (j==0 || j==i){ yanghui[i][j]=1; }else{ yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j]; } System.out.print(yanghui[i][j]+" "); } System.out.println(); } } } 第二种:等腰三角形 package aaa; public class YangHui { public static void main(String[] args) { /** * 8行8列的杨辉三角 */ int row = 6;//行数 int[][] yanghui = new int[row][row];//6行6列数组 for (int i = 0; i

杨辉三角

*爱你&永不变心* 提交于 2019-11-26 00:08:54
今天学习了廖雪峰老师的python教程,学到杨辉三角函数的时候很迷茫, 他的基本格式如下: [1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1], [1, 6, 15, 20, 15, 6, 1], [1, 7, 21, 35, 35, 21, 7, 1], [1, 8, 28, 56, 70, 56, 28, 8, 1], [1, 9, 36, 84, 126, 126, 84, 36, 9, 1] 因为觉得无从下手,思考了一下感觉就是需要上层和下层数据相加,但是错位相加,我也没接触过类似的方法,所以就先放弃了这种方法, 后来我又考虑到一个方法,就是将每一层当做一个数组,进行累积循环,这就需要借助yeild的记忆功能,所以,我就考虑了一方法是类似1+l[n-1]+l+1的方法,考虑了半天毫无头绪,所以就看了下答案....我的天我真心觉得自己只是不扎实不牢固...先上一个我最喜欢的方法: def triangles(n): #定义一个函数,并定义一个参数n,现在讲n看做是需要的杨辉三角的层数 L = [1] #定义一个列表L,并将其定义为是一个[1]的列表 while len(L) < n: #采用循环的方式,如果len(L)也就是层数,小于给定的层数,那么就可以继续循环 yield