把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法(用K表示)?请设计一个算法计算K值(只需要计算K值,不用把具体的分法输出)。注意:5,1,1和1,5,1是同一种分法。

题目

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法(用K表示)?请设计一个算法计算K值(只需要计算K值,不用把具体的分法输出)。注意:5,1,1和1,5,1是同一种分法。

参考答案和解析
正确答案: 例:M=7,N=3则有K=8
可能的分法为:
7,0,0
6,1,0
5,2,0
4,3,0
5,1,1
4,2,1
3,3,1
3,2,2
设f(m,n)为m个苹果,n个盘子的放法数目,则先对n作讨论,如果n>m,必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响;即if(n>m)f(m,n)=f(m,m)当n<=m时,不同的放法可以分成两类:即有至少一个盘子空着或者所有盘子都有苹果,前一种情况相当于f(m,n)=f(m,n-1);后一种情况可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n)=f(m-n,n).而总的放苹果的放法数目等于两者的和,即f(m,n)=f(m,n-1)+f(m-n,n)。边界条件为m=0或n=1时,只有一种放法。
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

(34)为计算 a 的值,某人编写了函数 power 如下:

Private Function power (a As Integer, n As Integer) As Long

Dim p As Long

p=a

For k=1 To n

p=p*a

Next k

power=p

End Function

在调试时发现是错误的,例如 Print power(5,4)的输出应该是 625,但实际输出是 3125。程序需要修改。

下面的修改方案中有 3 个是正确的,错误的一个是( )。

A)把 For k=1 To n 改为 For k=2 To n

B)把 p=p*a 改为 p=p^n

C)把 For k=1 To n 改为 For k=1 To n-1

D)把 p=a 改为 p=1


正确答案:C

(34)【答案】C)
【解析】计算an应该循环n次,所以此处K的取值应为“1 to n”,而非”n-1”.

第2题:

计算π的近似值的一个公式是π/4=1-1/3+1/5_1/7+…+(-1)n-11/(2n-1)。某人编写下面的程序用此公式计算并输出π的近似值:

Private Sub Command1_Click()

PI=1

Sign=1

13=20000

For k=3 To n

sign=-sign

PI=PI+sign/k

Next k

Print PI*4

End sub

运行后发现结果为3.22751,显然,程序需要修改。下面修改方案中正确的是

A.把For k=3To n改为For k=1 To n

B.把U=20000改为n=20000000

C.把For k:3 To n改为For k=3 To n Step 2

D.把PI=1改为PI=0


正确答案:C
解析:在π/4的近似求解公式中,分母是等差增加的,第一项分母可看作是1,第二项是3,第三项是7,依次类推。所以循环变量k应该每次增加2,故选项C)正确。程序中2n-一1是用k来控制的,(-1)n-1是通过sign来控制的。程序从首次运行结果是:1-1/3,继而不断增项。

第3题:

当k的值不为0时,在下列选项中能够将k的值赋给变量m,n的是

A.m=k=n

B.(m=k)&&(n=k)

C.(m=k)||(n=k)

D.(k=m)&&(n=k)


正确答案:B

第4题:

以下程序中,函数 sumColumM的功能是:求出M行N列二维数组每列元素中的最小值,并计算它们的和值。和值通过形参传回主函数输出。请填空。

define M 2

define N 4

void SumColumMin(int a[M][N],int *sum)

{ int i,j,k,s=0;

for(i=0;i〈N;i++)

{ k=0;

for(j=1;j<M;j++)

if(a[k][i]>a[j][i])k=j;

s+=【 】;

}

【 】 =s;

}

main( )

{ int x[M][N]={3,2,5,1,4,1,8,3},s;

SumColumMin(【 】);

printf("%d\n",s);

}


正确答案:a[k][i] *sum x[M][N]&s
a[k][i] *sum x[M][N],&s 解析:本题中if(a[k][I] >a [j] [I]) k=j;把一列中值较小的一个元素的索引存储到k中,所以[18]填[k] [i],[19]填返回值,右值为整型,所以应该填。sum,SnmColumMin(  )函数第一个参数为数组a[M][N],第二个参数为一个整型指针,所以[20]填x[M][N],&s。

第5题:

下列给定的程序中,函数fun()的功能是: 计算并输出k以内最大的6个能被7或11整除的自然数之和。K的值由主函数传入,若k的值为500,则函数的值为2925。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

include<stdio.h>

include<conio.h>

int fun(int k)

{

int m=0,mc=0,j;

/*************found*************/

while(k>=2)&&(mc<6)

{

/*************found*************/

if((k%7=0)||(k%ll=0))

{

/*************found**************/

m=k;

mc++;

}

k--;

}

return m;

}

main()

{

clrscr();

printf("%d\n",fun(500));

}


正确答案:(1)错误:while(k>=2)&&(mc6) 正确:while((k>=2)&&(mc6)) (2) 错误:if((k%7=0)||(k%11=0)) 正确:if((k%7==0)||(k%11=0)) (3) 错误:m=k 正确:m=m+k;
(1)错误:while(k>=2)&&(mc6) 正确:while((k>=2)&&(mc6)) (2) 错误:if((k%7=0)||(k%11=0)) 正确:if((k%7==0)||(k%11=0)) (3) 错误:m=k 正确:m=m+k; 解析:错误1:C语言规定while语句后的表达式两侧必须要有圆括号。错误2:if语句的判断条件应用关系运算符,而不是赋值运算符。错误3:根据题意,将满足条件的数求累加和。

第6题:

下列程序用来计算1+2+…n,当和大于100时停止计算,请填空。

Private Sub Form_Click()

Dim n as integer,s as integer,I as integer,k as integer

s=0

k=0

n=inputbox(″请输入n的值)

For i=1 to 100

k=k+1

s=s+I

【 】

Next i

Print s

End Sub


正确答案:if s>100 then exit for
if s>100 then exit for 解析:依题意,用变量S来记录1到n的累加和,当累加和S大于100时停止计算,故加入退出循环条件"if s>100 then exit for"

第7题:

10个大小相同的橘子放到3个不同的盘子里,允许有的盘子空着。请问一共有多少种不同的放法? A.286 B.220 C.120 D.66


正确答案:D
将10个大小相同的橘子放到3个不同的盘子里,允许有的盘子空着。若事先在每个盘子里各加1个橘子,此题就变成把13个大小相同的橘子放到3个不同的盘子里,每个盘子里至少有1个橘子。此时可利用隔板法,把13个橘子排成一列,则13个橘子之间有12个空隙。只要选定这12个空隙中的2个.在这2个空隙中分别放一块隔板,即可分成3组。所以只要求出从12个空隙中任意选出2个空隙有多少种方法

第8题:

请编写一个函数proc,它的功能是:求出1~m(含m) 能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。 例如,若传给m的值为70,则程序输出: 7 11 14 21 22 28 33 35 42 44 49 55 56 63 66 70 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括号中填人所编写的若干语句。 试题程序: include<stdlib.h> include<conio.h> include<stdio.h> define N 100 void proc(int m,int*a,int*n) {

} void main { int arr[N],n,k; system("CLS"); proc(70,arr,&n); for(k=0;k<n;k++) if((k+1)%20==0)//每行输出20个数 { printf("%4d",arr[k]); printf("\n"); } else printf("%4d",arr[k]); printf("\n"); }


正确答案:

void proc(int m,int*a,int*n)
{
int i,j=0;
for(i=1;i<=m;i++)//进行m次循环
if(i%7==0||i%11==0)//能被7或11整除的所有整数
a[j++]=i;//符合条件的数放在数组a中
*n=j;//返回这些数的个数
}
【解析】本题需要先判断1~m每一个整数能否被7或11整除,然后将符合条件的整数放在数组a中,最后将符合条件的数的个数通过形参n返回主函数。

第9题:

为计算a“的值,某人编写了函数power如下:

Private Function power(a As Integer,n As Integer)As Long

Dim P As Long

P=a

For k=l T0 n

P=P * a

Next k

poWer=P

End Function

在调试时发现是错误的,例如Print power(5,4)的输出应该是625,但实际输出是3125。程序需要修改。下面的修改方案中有3个是正确的,错误的一个是

A.把For k=1 To n改为For k=2 To n

B.把P=P*a改为P=p^n

C.把Fork=1 To n改为For k=1 To n-1

D.把P=a改为P=1


正确答案:C
解析:计算an应该循环n次,所以此处k的取值应为1 to n,而非n-1。

第10题:

计算的近似值的一个公式是π/4=1-(1/3)+(1/5)-(1/7)+…+(-1)n-1(1/2n -1)。 某人编写下面的程序用此公式计算并输出的近似值: Private Sub Cornmand1 Click( ) P1=1 Sign=1 n=20000 For k=3 To r Sign=-Sign PI=PI+SiRn/k Next k Print PI*4 End Sub 运行后发现结果勾3.22751,显然,程序需要修改。下面修改方案中正确的是( )。

A.把For k=3 To n改为For k=1 To n

B.把n=20000改为n=20000000

C.把For k=3 To n改为For k=3 To n Step 2

D.把PI=1改为P1=0


正确答案:C
c。【解析】Stop用在for循环中,表示每一次循环,变量增加几,本题中按照公式,k作为分母,值应为奇数,所以应用Fo,k=3TonStep2。是从3开始的奇数,所以本题为C。

更多相关问题